如何获取可在段落中找到的单个单词的索引(在char数组中表示)(再次表示在char数组中)。
char表示单词
char word[] = new char[]{'w','o','r','d'};
这是段落
char para[] = new char[]{'f','g','q','z','y','i','o','p','w','o','r','d'};
我想获得本案例中第一个字母的索引8。我在对词语进行排序时使用了二进制搜索。
感谢。
答案 0 :(得分:5)
理论上有点低效,但实用又简单:
int position = new String(paragraph).indexOf(new String(word));
如果您想了解其工作原理,请查看java.lang.String
的{{3}}方法
答案 1 :(得分:2)
在这种情况下,二进制搜索不会帮助您。你必须线性搜索。最简单的解决方案是线性搜索第一个字符,找到后检查剩下的字是否跟随。
更精细的解决方案是使用KMP algorithm。
答案 2 :(得分:1)
最简单的方法就是尝试所有可能性,循环遍历每个起始点并测试所有字符是否匹配。事实上你已经提到了二元搜索,这可能很简单,你已经知道了,但请告诉我你是否正在寻找它。
如果您正在寻找最佳方法,请参阅http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm。
答案 3 :(得分:1)
您可以将字符数组转换为字符串。在字符串中搜索的结果与搜索数组的结果相同。
String needle = new String(word);
String haystack = new String(para);
int i = haystack.indexOf(needle);
结果:
8
这可能比天真的O(n * m)搜索快得多,因为字符串函数indexOf
已经过优化。
如果您想在不创建临时字符串的情况下执行此操作,则可以为字节数组实现string searching algorithm。例如,您可以选择具有最差情况O(n)的Boyer-Moore算法。
答案 4 :(得分:0)
快速回答,我想其他人会更精细。最初,我会做这样的事情(伪代码更适合考虑算法):
boolean nonmatchingchar
integer i, j
for each i of word until endof word
for each j of para until endof para
if word i isnotequalto para i set nonmatchingchar true
end for
end for
if nonmatchingchar is true print "character sequence not found"
编辑:为了在你需要搜索多个单词的情况下提高效率,可以构成一个二维数组,其中的单词按照第一个字母排序。从那以后,你可以逐字逐句地查看第二个数组,并根据那封信测试一个单词的子集。