Problem: 809. Expressive Words 情感丰富的文字
解题过程
拿到不重复的最短字符串,像heeellooo,最短字符串是kelo, hheeellloo的最短字符串也是helo,hhii的最短字符串是hi,两者比较不同的话则总数-1,然后统计最短字符串的重复次数,像heeelloooo的重复次数是:1 3 2 4, hheellloo的重复次数是2 2 3 2,两者比较大小即可,if(tr[w] - trr[w] < 0 || (tr[w] < 3 && trr[w]!=tr[w])) {count–; break;}
s中次数<3的重复需要-1
Code
class Solution { public: int expressiveWords(string s, vector<string>& words) { int count = words.size(); string k, kk; k += s[0]; for(int i = 1; i < s.size(); i++) { if(s[i]!=k.back()) k+=s[i]; } vector<int> tr(k.size(), 0), trr; int num = 0, j = 0; for(int i = 0; i < s.size(); i++) { if(s[i]!=k[j]) { tr[j] = num; num = 0; j++; i--; } else { num++; } } tr.back() = num; for(int i = 0; i < words.size(); i++) { int l = 0, r = 0; char pre = words[i][0]; kk.clear(); kk += words[i][0]; for(int j = 1; j < words[i].size(); j++) { if(words[i][j]!=kk.back()) kk+= words[i][j]; } if(k!=kk) { count--; continue; } trr.assign(kk.size(), 0); num = j = 0; for(int w = 0; w < words[i].size(); w++) { if(words[i][w]!=kk[j]) { trr[j] = num; num = 0; j++; w--; } else { num++; } } trr.back() = num; for(int w = 0; w < tr.size(); w++) { if(tr[w] - trr[w] < 0 || (tr[w] < 3 && trr[w]!=tr[w])) { count--; break; } } } return count; } };