有時候人們會用重復寫一些字母來表示額外的感受,比如 “hello” -> “heeellooo”, “hi” -> “hiii”。我們將相鄰字母都相同的一串字符定義為相同字母組,例如:“h”, “eee”, “ll”, “ooo”。
對于一個給定的字符串 S ,如果另一個單詞能夠通過將一些字母組擴張從而使其和 S 相同,我們將這個單詞定義為可擴張的(stretchy)。擴張操作定義如下:選擇一個字母組(包含字母 c ),然后往其中添加相同的字母 c 使其長度達到 3 或以上。
例如,以 “hello” 為例,我們可以對字母組 “o” 擴張得到 “hellooo”,但是無法以同樣的方法得到 “helloo” 因為字母組 “oo” 長度小于 3。此外,我們可以進行另一種擴張 “ll” -> “lllll” 以獲得 “helllllooo”。如果 S = “helllllooo”,那么查詢詞 “hello” 是可擴張的,因為可以對它執行這兩種擴張操作使得 query = “hello” -> “hellooo” -> “helllllooo” = S。
輸入一組查詢單詞,輸出其中可擴張的單詞數量。
示例:
輸入:
S = “heeellooo”
words = [“hello”, “hi”, “helo”]
輸出:1
解釋:
我們能通過擴張 “hello” 的 “e” 和 “o” 來得到 “heeellooo”。
我們不能通過擴張 “helo” 來得到 “heeellooo” 因為 “ll” 的長度小于 3 。
代碼
class Solution {public int expressiveWords(String S, String[] words) {int n=S.length(),res=0;if (n==0) return 0;int[] jump=new int[n];//記錄出現的多個連續重復字符的末尾位置jump[n-1]=n-1;for(int i=n-2;i>=0;i--){if(S.charAt(i)==S.charAt(i+1))jump[i]=jump[i+1];else jump[i]=i;}for(String string:words)//遍歷words{int start=0,i=0;for(;i<string.length()&&start<n;i++)//遍歷單詞的每個字符{if(string.charAt(i)==S.charAt(start))//相同字符{int len=1;while (i+1<string.length()&&string.charAt(i)==string.charAt(i+1))//找出后面相同字符的長度{i++;len++;}int len2=jump[start]+1-start;//根據jump數組直接得出最后一個重復字符的位置if(len2<=2&&len2!=len||len>len2)
//當S中字符連續的長度小于2,不能任意匹配長度,必須和word連續的長度相同break;start=jump[start]+1;}else break;}if(i==string.length()&&start==n) res++;}return res;}
}