在字符串

时间:2015-10-14 20:59:43

标签: java

我正在尝试在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。

3 个答案:

答案 0 :(得分:2)

此处的算法如下:

  1. 使用主循环,当找到单词时,或者当我们达到他的长度减去第二个字符串的长度时,它将停止。 (例如:如果str1的长度为6,str2的长度为4,我们知道str2不会从索引3开始)。

  2. 使用第二个循环检查str2的索引是否在str1中以某种方式拟合。我们检查每个索引,一个接一个地在内部。如果其中一个与主循环的循环索引不对应,我们将从内循环中断,并将其添加到主循环的索引中。

  3. 如果内循环成功完成,我们就知道找到了这个单词。

  4. 以下是仅使用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()正是您要找的。

Simple tutorial

除非你有要求不使用内置功能,否则不要重新发明轮子。

上面的教程链接示例:

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;
} 

<强>说明

循环将检查substr是否存在以下方法:

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