1. 程式人生 > >字符串題目集錦

字符串題目集錦

取整 eat efi kmp算法 else if force 循環 spa 字符

2018-01-24 20:19:48

  • 重復字符串匹配

問題描述:

技術分享圖片

問題求解:

使用brute force的方法求解,也就是依次比較,但是差別就是在A到末尾的時候循環從頭開始繼續進行比較。

    public int repeatedStringMatch(String A, String B) {
        for (int i = 0,j; i < A.length(); i++) {
            for (j = 0; j < B.length() && B.charAt(j) == A.charAt((i+j) % A.length()); j++);
            // i就是A中前面失配的個數,j.length = 部分1 + n * A.length + 部分2
            // i + j = i + 部分1 + n * A.length + 部分2 =(n + 1)* A.length + 部分2
            // 所以其實就是一個向上取整
            if(j == B.length()) return (i+j) / A.length() + ((i + j) % A.length() == 0 ? 0 : 1);
        }
        return -1;
    }

使用brute force的方法求解的運行效率是很低的,可以采用KMP算法加之改進。

    public int repeatedStringMatch(String A, String B) {
        int[] prefix = new int[B.length()];
        for (int i = 1, j = 0; i < B.length(); ) {
            if (B.charAt(i) == B.charAt(j)) prefix[i++] = ++j;
            else if (j == 0) i++;
            else j = prefix[j - 1];
        }
        for (int i = 0, j = 0; i < A.length(); i += j - prefix[j - 1], j = prefix[j - 1]) {
            while (j < B.length() && A.charAt((i + j) % A.length()) == B.charAt(j)) j++;
            if (j == B.length()) return (int)Math.ceil((double)(i + j) / A.length());
            if (j == 0) j++;
        }
        return -1;
    }

字符串題目集錦