1. 程式人生 > >leetcode 467. 環繞字符串中唯一的子字符串

leetcode 467. 環繞字符串中唯一的子字符串

problem targe strong substring ring uniq 輸出字符串 存儲 sub

題目描述:

把字符串 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”。

思路:
如例3,當字符串為‘z‘時,子串只有‘z‘,個數為1;當字符串為‘za‘時,字串有‘z‘,‘a‘,‘za‘,個數為3,和字符串‘z‘相比,新增子串個數為2;
字符串‘zab‘,新增子串有‘b‘,‘ab‘,‘zab‘3個。
也就是說按序的字符串每增加一個,新增的字串個數加1。
建一個數組,存儲每次新增的子串個數,最後統計數組中數字的和。
題目鏈接:https://leetcode-cn.com/problems/unique-substrings-in-wraparound-string/
class Solution {
public:
    int findSubstringInWraproundString(string p) {
        int maps[27];
        int m[2];
        int len,num = 0
; memset(maps,0,sizeof(maps)); for(int i = 0;i<p.size();i++) { if(i == 0) { len = 1; maps[p[i]-a] = 1; } else { if(p[i-1] == p[i]-1 || (p[i] == a && p[i-1] == z) ) //如果連續,則新增子串數加1 { len++; } else { len = 1; } if(len > maps[p[i]-a]) //存儲子串個數 { maps[p[i]-a] = len; } } } for(int i = 0;i<26;i++) { num = num + maps[i]; } return num; } };

leetcode 467. 環繞字符串中唯一的子字符串