java - 如何将while循环转换为for循环

标签 java string algorithm matching

我正在使用 java 研究字符串匹配算法,我需要将 while 循环转换为 for 循环以便轻松处理它。

我需要将 KMPSearch 中的 while 循环转换为 for 循环 目的是在搜索过程开始之前检查要跳过的某些字符。 我不知道在哪里插入这部分代码

void KMPSearch(String txt, String pat) {

        int N=txt.length();
        int M=pat.length();
        int lps[]=new int[M];
        int j=0;// index of patt
        int i=0; //index of txt
        int c=0;
        computeLPS(lps,M,pat);
        //char [] skipChar=new char[] {'s','d','a','c'};

        while(i<N) {

            if(pat.charAt(j)==txt.charAt(i)) {
                i++;
                j++;
            }
            if(j==M) {
                System.out.println("pattern found at index  "+ (i-j-c));
                j=lps[j-1];

            }
            else if (i<N && pat.charAt(j) != txt.charAt(i)) {


                if (j != 0) {
                    j=lps[j-1];
                }
                else {
                    i=i+1;
                }

            }

        }


    }

最佳答案

如果我没理解错的话,您需要一个循环对 txt 中的每个字符执行一次迭代。您的循环可以这样重写:

    for (int i = 0; i < N; i++) {
        char ch = txt.charAt(i);
        /* Perform your potential char test here */
        while (j > 0 && (j == M || pat.charAt(j) != ch)) {
            if (j == M) {
                System.out.println("pattern found at index  "+ (i-j-c));
            }
            j = lps[j-1];
        }
        if (pat.charAt(j) == ch) {
            j++;
        }
    }

这不是完全相同的,因为理论上您的循环可以在新迭代开始时使用 j == M 进行迭代——这将导致错误。当发生这种情况时,上面的替代方案将继续内部 while 循环。但可能您的 lps 是这样的,您的代码也永远不会遇到这种情况。所以它们实际上是等价的。

关于java - 如何将while循环转换为for循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57284790/

相关文章:

java - PrintWriter 未写入文件(Java)

java - 如何将 Hudson 的 env.EXECUTOR_NUMBER 传递给 log4j 属性和 Java 的 System.getProperty

java - java将罗马数字转换为数字逻辑错误

javascript - 如何替换两个符号之间所有出现的字符串?

string - lua中如何使用字符串作为变量名

java - 如何分割一串点?

algorithm - 查找跨越给定最小生成树的最小权重完整图

algorithm - 通信复杂性

java - 导出可运行的 JAR 文件

algorithm - 计算一百万个质数