Q467 环绕字符串中唯一的子字符串

把字符串 s 看作是“abcdefghijklmnopqrstuvwxyz”的无限环绕字符串,所以 s 看起来是这样的:"...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....".

现在我们有了另一个字符串 p 。你需要的是找出 s 中有多少个唯一的 p 的非空子串,尤其是当你的输入是字符串 p ,你需要输出字符串 sp 的不同的非空子串的数目。

注意: p 仅由小写的英文字母组成,p 的大小可能超过 10000。

示例 1:

输入: "a"
输出: 1
解释: 字符串 S 中只有一个"a"子字符。

示例 2:

输入: "cac"
输出: 2
解释: 字符串 S 中的字符串“cac”只有两个子串“a”、“c”。.

示例 3:

输入: "zab"
输出: 6
解释: 在字符串 S 中有六个子串“z”、“a”、“b”、“za”、“ab”、“zab”。.
class Solution {
    public int findSubstringInWraproundString(String p) {
        if (p == null || p.length() == 0)
            return 0;

        int[] nums = new int[26];
        char[] chs = p.toCharArray();

        nums[chs[0] - 'a'] = 1;
        int t = 2;
        for (int i = 1; i < chs.length; i++) {
            if (chs[i] != chs[i - 1] + 1 && chs[i] != chs[i - 1] - 25) {
                t = 1;
            }

            int k = nums[chs[i] - 'a'];
            nums[chs[i] - 'a'] = k > t ? k : t;
            t++;
        }

        int result = 0;
        for (int i : nums)
            result += i;

        return result;
    }

}
posted @ 2019-04-20 17:01  围城DDD  阅读(160)  评论(0编辑  收藏  举报