在Java中查找字符串中的子字符串

Rah*_*Sah 6 java

我正在编写一个程序来在Java中查找字符串中的子字符串,而不使用任何Java库.

我写了一个函数subString(String str1, String str2),如下所示.

它适用于以下输入:

  1. str1="rahul" str2="My name is rahul"
  2. str1="rahul" str2="rahul sah"
  3. str3="rahul" str2="sah rahul"

当我输入输入时出现问题:

  1. str1="rahul" str2="rararahul"
  2. str1="rahul" str2="My name is sunil"

它进入无限循环.任何人都可以查看我的代码片段并帮助我.

    public static boolean subString(String str1, String str2) {
        boolean found = false;
        int len1 = str1.length();
        int len2 = str2.length();
        int status = 0;
        char[] arr1 = new char[len1];
        char[] arr2 = new char[len2];
        for (int ii = 0; ii < len1; ii++) {
            arr1[ii] = str1.charAt(ii);
        }
        for (int jj = 0; jj < len2; jj++) {
            arr2[jj] = str2.charAt(jj);
        }
        for (int ii = 0; ii < len1; ii++) {
            for (int jj = 0; jj < len2; jj++) {
                if (arr1[ii] == arr2[jj]) {
                    if (ii < len1 - 1) {
                        System.out.println("Found1::" + "arr1::" + arr1[ii]
                                + "and arr2::" + arr2[jj]);
                        found = true;
                        ii++;
                    } else if (arr1[ii] == arr2[jj] && ii == len1 - 1) {
                        System.out.println("Found2::" + "arr1::" + arr1[ii]
                                + "and arr2::" + arr2[jj]);
                        found = true;
                        break;
                    }
                } else if (found == false && arr1[ii] != arr2[jj]) {
                    System.out.println("Found3::" + "arr1::" + arr1[ii]
                            + "and arr2::" + arr2[jj]);
                    found = false;

                } else if (found == true && arr1[ii] != arr2[jj]) {
                    System.out.println("Found4::" + "arr1::" + arr1[ii]
                            + "and arr2::" + arr2[jj]);
                    found = false;
                    ii = 0;
                }
            }
        }
        return found;
    }
}
Run Code Online (Sandbox Code Playgroud)

J R*_*ape 11

其他人建议使用String.contains()- 这是java.lang代码,而不是Java库.但是,你显然想要探索如何自己做到这一点.一种方法是查看String.contains()封面使用的OpenJDK 7源代码String.indexOf().你可以看到他们在那里使用的(相当基本的)算法.

你的代码有问题

有趣的是,当我将代码粘贴到我的开发环境中时,你的代码适用于"rahul"和"rararahul".但是,存在非匹配的无限循环.str2包含任何字符的任何字符都会出现这种情况str1.这是因为一旦在str2中找到str1中任何字符的匹配项,就会重置变量以重新开始.如果你查看它通过每个字符串的序列,你的输出实际上足以调试它.

可能的修复

如果您想要追求自己的方法并从中学习,那么请考虑使用自己的方法停止并在纸上进行一些设计.你正在寻找一个出现str1str2.所以你可能想换掉你的循环.那么你可以更有效率.您可以str2在外部循环中逐个字符地查看较长的String()字符.如果较短的string(str1)的第一个字符与你正在处理的字符相匹配,那么你只需要进入内循环str2.

例如,代码的循环位

    boolean retFound = false;

    for (int jj = 0; jj < len2; jj++) {
        if (arr1[0] == arr2[jj]) {
            boolean tempFound = true;
            int foundIndex = jj;
            for (int ii = 0; ii < len1; ii++) {
                if (arr1[ii] != arr2[jj+ii]) {
                    tempFound = false;
                    break;
                 }
             }

             if (tempFound) {
                  System.out.println("Found substring " + str1 + " in " + str2 + " at index " + foundIndex);
                  System.out.println("Carrying on to look for further matches...");
                  tempFound = false;
                  retFound = true;
             }
        }
   }

   return retFound;
Run Code Online (Sandbox Code Playgroud)

注意,这不会很快,但它应该工作.我已经测试了你提供的所有字符串样本.你也得到奖金 - 它会找到多个匹配.如果你不想那样(只是想要真假),当它说"继续寻找......"时突然爆发.

正如其他人所说,如果你想继续使用原始代码,当然不要试图在内循环中改变循环变量(即ii).这是不好的做法,难以阅读并容易出现大量错误.