我正在尝试实现简单的字符串匹配。如果 source String包含 pattern String,则算法应返回1。我无法理解为什么它在以下输入上返回-1
String source = "aababba";
String pattern = "abba";
这是我的实施:
public static int findMatch(String source, String pattern)
{
int j = 0, pos = -1;
boolean matched = false;
if(source.length() < pattern.length())
return -1;
for(int i = 0; i < (source.length() - pattern.length()); i++)
{
if(source.charAt(i) == pattern.charAt(j))
j++;
else
j = 0;
if(j == pattern.length())
{
matched = true;
break;
}
}
if(matched)
return 1;
return -1;
}
修改 正如你们许多人所说,罪魁祸首是for循环。 我应该如下所示。其余的代码是一样的。其他解决方案也可以如答案中所示。
for(int i = 0; i <= (source.length() - pattern.length()); i++)
{
if(source.charAt(i+j) == pattern.charAt(j))
{
答案 0 :(得分:6)
您只检查三个字符
source.length() - pattern.length()
所以j
永远不会等于pattern.length
。您需要检查整个source
。
for(int i = 0; i < source.length(); i++)
{
if(source.charAt(i) == pattern.charAt(j))
...
}
关于解决方案
for(int i = 0; i <= (source.length() - pattern.length()); i++)
{
if(source.charAt(i+j) == pattern.charAt(j))
{
为什么有一个额外的减法和加法以及更复杂的代码,只需逐步浏览源代码?
答案 1 :(得分:2)
问题的根源是您已将i
变量的上限限制为(source.length() - pattern.length())
。您编写的for
循环无法检查source
字符串的所有字符,因此即使对于可以找到匹配项的一些字符串对,它也会返回-1。
解决方案:像这样重写for
循环:
for(int i = 0; i < source.length(); i++)
答案 2 :(得分:1)
源的长度为7.模式的长度为4.对于i&gt;,您的语句i < (source.length() - pattern.length()
将不为真。 2所以循环只是不够“远”。
答案 3 :(得分:1)
您可以轻松使用String.contains方法检查字符串是否包含模式。
答案 4 :(得分:1)
我想你已经知道它返回错误的原因了。你可以试试这个:
j = 0;
while(j <= (source.length() - pattern.length())){
for (i = pattern.length(); i >= 0 && pattern[i] == source[i + j]; --i);
if (i < 0)) {
matched = true;
break;
}
else j++;
}
关于字符串匹配,有很多方法,可以使用KMP,BM和Sunday等,性能比较是:KMP&lt; BM&lt;星期天,你可以尝试这些,他们非常有用。
答案 5 :(得分:0)
通过使用此语句(source.length() - pattern.length())
,您只在源的三个第一个字符串上循环字符串。所以我永远找不到整个模式。
尝试使用pattern.length()
,或者更好地尝试计算pattern.length()
和source.length()
的最小值
答案 6 :(得分:0)
我认为它应该返回1
,因为"aababba"
最后包含"abba"
。
这将从您的编辑(解决方案)返回1
:
for(int i = 0; i <= (source.length() - pattern.length()); i++) {
if(source.charAt(i+j) == pattern.charAt(j)) {
但是根据我的假设,你应该查看source
中的每一封信,以便我使用:
for(int i = 0; i < source.length(); i++) {
if(source.charAt(i) == pattern.charAt(j)) {
因为为什么要忽略最后一串字符?
但也许我只是假设你想要你的算法做错了,因为根据我的假设,你可以使用:
if (source.contains(pattern))
return 1;
else
return -1;