检查字符串中的字符集

时间:2011-10-27 20:53:24

标签: c# string

给定一个字符串,如何检查字符串中是否存在一组字符(并找到它们的位置),使得字符需要处于相同的顺序但不能连续。

例如字符串“INEEDTOGETAHAIRCUT”和设置为查找{'O','E','G','T'}

由于

(ps - 我已经尝试过蛮力尝试,但它很糟糕且不起作用!)

5 个答案:

答案 0 :(得分:1)

使用System.Linq可以执行此操作:

"INEEDTOGETAHAIRCUT".ToCharArray().Any(c => c=='O' || c=='E' || c=='G' || c=='T');

或者编写一个新的扩展方法来接受char数组作为参数。  要以任何顺序拥有任何“序列”字符,您可以这样做:

public static class MyExtensions
{

    public static bool ContainsAnySequenceOf(this String str, List<char> charArray)
    {
        foreach (char c in charArray)
        {
            if (str.ToCharArray().Any(x => x == c))
            {
                charArray.Remove(c);
                return str.Substring(str.IndexOf(c), Math.Min(str.Length - str.IndexOf(c), charArray.Count)).ContainsAnySequenceOf(charArray);
            }
        }
        return false;
    }
}

然后这样称呼:

"INEEDTOGETAHAIRCUT".ContainsAnySequenceOf(new List<char> {'O','E','G','T'});

答案 1 :(得分:1)

如果我不是100%确定“字符互相跟随”的意思,这里有一种可能的方法:生成字符序列的所有可能的排列 并搜索排列

using System;
using System.Collections.Generic;
class Program {

    static IEnumerable<string> GetPermutations(string value) {
        if (value.Length == 1) {
            yield return value;
        } else {
            for (int i = 0; i < value.Length; ++i) {
                string a = value[i].ToString();
                foreach (string b in GetPermutations(value.Remove(i, 1))) {
                    yield return a + b;
                }
            }
        }
    }

    static void Main(string[] args) {

        string test = "INEEDTOGETAHAIRCUT";
        string chars = "OEGT";
        foreach (string to_find in GetPermutations(chars)) {
            int i = test.IndexOf(to_find);
            if (i != -1) {
                Console.WriteLine("Found {0} at index {1}", to_find, i);
            }
        }
    }
}

答案 2 :(得分:1)

为什么不使用更简单的东西,只用两行来检查你需要的东西

string strCompare = "INEEDTOGETAHAIRCUT";
string strStringContains = ""AHRI"; 
var matchingString = strCompare.IndexOfAny(strStringContains.ToCharArray()) != -1;
then wrap the matchingString in an if(matchingString){ } // should return true or false

答案 3 :(得分:0)

如果我理解你的问题:

您可以使用String.IndexOfAny()查找序列的第一个字符。

然后迭代字符串中的以下字符以检查它们中的每一个是否包含在合法字符集中。对于您从列表中找到的每个字符(包括您找到的第一个字符),将其从可以遵循的合法字符列表中删除,以禁止重复。

如果您点击非法字符,则文本不匹配,因此请返回此算法的开头以处理字符串的剩余部分。

如果您连续找到所有合法字符,那么您就得到了结果。

答案 4 :(得分:0)

这是解决问题的一种非常不优雅的旧学校方法。虽然我确信某些代码可能更有效,但它避免枚举搜索集的所有排列(如您接受的答案中所做的那样)。这样做可能会变得昂贵。

static bool matchesPermutation(string test, string search)
{
    string remaining = search;
    for (int i = 0; i < test.Length; i++)
    {
        int pos = remaining.IndexOf(test[i]);
        if (pos == -1)
            return false;
        else
            remaining = remaining.Remove(pos, 1);
    }
    return true;
}

static int findPermutation(string test, string search)
{
    for (int i = 0; i < test.Length-search.Length+1; i++)
        if (matchesPermutation(test.Substring(i, search.Length), search))
            return i;
    return -1;
}

static void Main(string[] args)
{
    string test = "INEEDTOGETAHAIRCUT";
    string search = "AHRI";
    int foundPos = findPermutation(test, search);
    Console.WriteLine(foundPos);
    if (foundPos != -1)
        Console.WriteLine(test.Substring(foundPos, search.Length));
}