我正在尝试在str2中找到str1的一部分(两个字符串)。目前我有一个工作程序,但在我看来,它并没有完全正常工作或使用正确的逻辑。
public static void main(String[] params) {
String str1 = "blis";
String str2 = "grisdisbliszis";
//String str2 = "adasdsfgsdfdcx";
System.out.println(isCommonSubstring(str1, str2));
}
public static boolean isCommonSubstring(String str1, String str2) {
char char1, char2;
boolean match = true;
String check = "";
for(int i = 0; i < str1.length(); i++) {
char1 = str1.charAt(i);
for(int j = 0; j < str2.length(); j++) {
char2 = str2.charAt(j);
if(char1 == char2) {
check += char1;
System.out.println("Matched!: "+str1.charAt(i)+"[Char "+i+"] <==> " // DEBUG
+str2.charAt(j)+"[Char "+j+"]"); // DEBUG
break; // Break because we've found our first match and we need to check others
}
}
}
System.out.println(check+" || "+str1);
if(check.equals(str1)) match = true;
else match = false;
return match;
}
这可能有效,但如果我将这两个字符串转过来就不再有用了。
如何改善寻找匹配的逻辑?我试图以某种方式使用substring()但是我不确定如何将其放入其中。
我正在考虑的解决方案可能是使if语句比较长度并使str2的长度更长,因此它总是更长并且不会导致错误。但这是一个不错的解决方案吗?
我只能使用length,substring和charAt。
答案 0 :(得分:2)
此处的算法如下:
使用主循环,当找到单词时,或者当我们达到他的长度减去第二个字符串的长度时,它将停止。 (例如:如果str1的长度为6,str2的长度为4,我们知道str2不会从索引3开始)。
使用第二个循环检查str2的索引是否在str1中以某种方式拟合。我们检查每个索引,一个接一个地在内部。如果其中一个与主循环的循环索引不对应,我们将从内循环中断,并将其添加到主循环的索引中。
如果内循环成功完成,我们就知道找到了这个单词。
以下是仅使用charAt()
和lenght()
:
static boolean isCommonSubstring (String one, String two) {
if (one.length() < two.length()){
String tmp = one;
one = two;
two = tmp;
}
MAIN :
for (int i = 0 ; i <= one.length()-two.length() ; i++){
for (int j = 0 ; j < two.length() ; j++){
if ((one.charAt(i+j) != two.charAt(j))) continue MAIN;
}
return true;
}
return false;
}
答案 1 :(得分:1)
String.contains()
正是您要找的。 p>
除非你有要求不使用内置功能,否则不要重新发明轮子。
上面的教程链接示例:
String str1 = "tutorials point", str2 = "http://";
CharSequence cs1 = "int";
// string contains the specified sequence of char values
boolean retval = str1.contains(cs1);
System.out.println("Method returns : " + retval);
// string does not contain the specified sequence of char value
retval = str2.contains("_");
System.out.println("Methods returns: " + retval);
}
如果您想要不区分大小写:
str1.toLowerCase.contains(str2.toLowerCase());
修改强>
结果OP不能使用builtin
函数。请留下答案,以防万一其他人来这里不想重新发明轮子:)
答案 2 :(得分:0)
我只能使用length,substring和charAt
因为您只能使用这些方法。这就是你能做的:
//Self-defined method to check whether sub exist in str
public static boolean contains(String str, String sub){
if(sub.length() > str.length())
return false;
for(int x=0; x<= str.length() - sub.length(); x++)
if(str.substring(x, sub.length()+x).equals(sub))
return true;
return false;
}
<强>说明强>
循环将检查sub
中str
是否存在以下方法:
apple (Compare "app" with "ple" ==> does not match);
^^^
apple (Compare "ppl" with "ple" ==> does not match);
^^^
apple (Compare "ple" with "ple" ==> match, return true);
^^^
<强>测试强>
String a = "apple";
String b = "ple";
System.out.println(a + " contains " + b + ": " + contains(a, b));
<强>输出:强>
apple contains ple: true