微软面试问题:为字符串匹配编写一个有效的字符串匹配程序?

时间:2010-10-25 09:56:40

标签: algorithm string

编写一个节省时间的C程序,它接受两个字符串(字符串a,字符串b)并在字符串a中首次出现字符串b。

8 个答案:

答案 0 :(得分:4)

许多算法都在字符串匹配上。例如,Knuth-Morris-Pratt算法,Boyer-Moore算法。只需参考任何一个算法手册。

答案 1 :(得分:3)

我认为以下内容应该达到你打算做的目的 -

  

int main(int argc,char * argv [])   {

string A, B;
size_t pos;

while (true) 
{
    cout << endl << "Enter string: ";
    getline(cin,A);
    cout << "Enter substring to find: ";
    getline(cin,B);
    if ((A.size() > 0) && (B.size() > 0)) 
    {
        cout << "\"" << B << "\" is";
        if ((pos = find(A,B)) == string::npos) 
        {
            cout << " not";
        }
        cout << " a substring of \"" << A<< "\"";
        if (pos != string::npos) 
        {
            cout << ", found at index " << pos;
        }
        cout << endl;
    }
}
return 0;
     

}

答案 2 :(得分:2)

答案 3 :(得分:2)

尝试使用:

public class client {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println(poSubString("bac","ba"));
    }

    public static int poSubString(String a, String b){
        if (a.length()<b.length())
            return -1;
        int pointerA=0;
        int pointerB=0;
        while(pointerA+b.length()<=a.length() && pointerB<b.length()){
            if (a.charAt(pointerA+pointerB)==b.charAt(pointerB))
                pointerB++;
            else{
                pointerB=0;
                pointerA++;
            }
        }   
        if (pointerB==b.length())
            return pointerA;
        else
            return -1;
    }

}

答案 4 :(得分:1)

  

编写一个有效的C程序,它接受两个字符串(字符串a,字符串b),并在字符串a中首次出现字符串b。

它并没有说你正在对任何一个字符串进行重复匹配,或者对一个特别短,特定内容的任何有用的洞察力,或者有足够的启动时间然后触发事件,之后快速尽可能的比较是需要,所以:其他答案中提到的所有复杂算法可能都不是面试官所要求的。

我读“有效”意味着算法没有迭代并调用一个外行strcmp(),注意不要重复调用strlen(),如果相等比较耗尽“haystack”之前最好立即返回false “针”。老实说,如果这是一次早期的筛选访谈,那么就会有足够多的人不能很好地实现这样的东西 - 这是他们想要的,而不需要进入先进的先前索引或状态机,这是非常可信的。

答案 5 :(得分:0)

如果您有兴趣,可以在他的“图形编程黑皮书”中查看Michael Abrash的chapter(PDF)关于字符串搜索的内容。 The rest of the book can be freely accessed here

他在C中开始使用一个很好的例程,然后改进它并在汇编中实现它。虽然不是真的在面试问题的范围内,但我认为大多数面试官会对如何优化答案的解释留下深刻的印象。

答案 6 :(得分:0)

问题没有指定如果B在A中没有出现的结果,也没有要求事件的位置。因此可以安全地假设A包含B.因此程序应该返回字符串B,因为A中第一次出现的B的值将等于B.

我相信Windows NT的POSIX合规性基于类似的原则。

答案 7 :(得分:0)

在java中

包com.salpe.ds;

public class TestContainsString {     public static void main(String [] args){

    char[] string1 = new char[] { 'a', 'b', 'c', 'd', 'e', 'x', 'f', 'g',
            'e', 'x' };
    char[] string2 = new char[] { 'e', 'x' };

    char[] longerChar;
    char[] shortChar;

    if (string1.length > string2.length) {

        longerChar = string1;
        shortChar = string2;

    } else {
        longerChar = string2;
        shortChar = string1;
    }

    int j = 0;
    int totalOccurences = 0;

    for (int i = 0; i < longerChar.length; i++) {

        if (longerChar[i] == shortChar[j]) {
            j++;

        } else {

            j = 0;
        }

        if ((j) == shortChar.length) {
            System.out.println("Found");
            j = 0;
            totalOccurences++;
        }
    }

    System.out
            .println(String.valueOf(shortChar) + " Found in "
                    + String.valueOf(longerChar) + " " + totalOccurences
                    + " times");

}

}