编写一个节省时间的C程序,它接受两个字符串(字符串a,字符串b)并在字符串a中首次出现字符串b。
答案 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");
}
}