[英]Java | compare char word in a char array
如何获取可在段落中找到的单个单词的索引(表示在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。 我在排序单词scrambled时使用了二进制搜索。
谢谢。
理论上有点低效,但实用而简单:
int position = new String(paragraph).indexOf(new String(word));
如果你想了解它是如何工作的 - 检查java.lang.String
的static int indexOf(..)
方法
在这种情况下,二进制搜索不会帮助您。 你必须线性搜索。 最简单的解决方案是线性搜索第一个字符,找到后检查剩下的字是否跟随。
更精细的解决方案是使用KMP算法 。
最简单的方法就是尝试所有可能性,循环遍历每个起始点并测试所有字符是否匹配。 事实上你已经提到了二元搜索,这可能很简单,你已经知道了,但请告诉我你是否正在寻找它。
如果您正在寻找最佳方法,请参阅http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm 。
您可以将字符数组转换为字符串。 在字符串中搜索的结果与搜索数组时的结果相同。
String needle = new String(word);
String haystack = new String(para);
int i = haystack.indexOf(needle);
结果:
8
这可能比天真的O(n * m)搜索快得多,因为字符串函数indexOf
已经过优化。
如果要在不创建临时字符串的情况下执行此操作,则可以为字节数组实现字符串搜索算法 。 例如,您可以选择具有最差情况O(n)的Boyer-Moore算法。
快速回答,我想其他人会更精细。 最初,我会做这样的事情(伪代码更适合思考算法):
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"
编辑:为了在你有几个要搜索的单词的情况下提高效率,你可以构成一个二维数组,其中的单词按照第一个字母排序。 从那以后,你可以逐字逐句地查看第二个数组,并根据该字母测试一个单词的子集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.