For example, starting with "hello", we could do an extension on the group "o" to get "hellooo", but we cannot get "helloo" since the group "oo" has size less than 3. Also, we could do another extension like "ll" -> "lllll" to get "helllllooo". If S = "helllllooo"
, then the query word "hello" would be stretchy because of these two extension operations: query = "hello" -> "hellooo" -> "helllllooo" = S
.
Example: Input: S = "heeellooo" words = ["hello", "hi", "helo"] Output: 1 Explanation: We can extend "e" and "o" in the word "hello" to get "heeellooo". We can't extend "helo" to get "heeellooo" because the group "ll" is not size 3 or more. 思路:google高頻,我寫的時候是用雙指針,但是空間很費,後來看了答案,確實有簡潔的寫法,用兩個指針分別處理兩個string即可。確實學習了很多,同樣的思想,代碼寫出來不一樣;
class Solution {
public int expressiveWords(String S, String[] words) {
if(S == null || words == null || words.length == 0) {
return 0;
}
int count = 0;
for(String word : words) {
if(isStretchy(S, word)) {
count++;
}
}
return count;
}
private boolean isStretchy(String S, String word) {
int i = 0; int j = 0;
while(i < S.length() && j < word.length()) {
int scount = 1;
while(i + 1 < S.length() && S.charAt(i) == S.charAt(i+1)) {
scount++;
i++;
}
int wcount = 1;
while(j + 1 < word.length() && word.charAt(j) == word.charAt(j+1)) {
wcount++;
j++;
}
if(i < S.length() && j < word.length() && S.charAt(i) == word.charAt(j)) {
if(scount == wcount || (scount >= 3 && scount > wcount )) {
i++;
j++;
} else {
return false;
}
} else {
return false;
}
}
return i == S.length() && j == word.length();
}
}