828. 獨特字串
阿新 • • 發佈:2018-12-03
超時解法1:過了32個測試用例
class Solution { public: int uniqueLetterString(string S) { int ans = S.length(), len = 2, begin = 0; while (len<=S.length()) { if (begin+len<=S.length()) { ans += cnt(S, len, begin); begin++; } else { len++; begin = 0; } } return ans; } int cnt(string s, int len,int begin) { int ans = 0; map<char, int> count; for (int i = begin; i <begin+len; i++) { if (count[s[i]] == 0) { ans++; } else if(count[s[i]]==1) { ans--; } count[s[i]]++; } return ans; } };
超時解法2:過了62個測試用例,卡在的最後一個了
兩層for迴圈,第一層for遍歷整個字串,第二層以i為起點遍歷整個字串,直到所有的字母都出現過。
map容器只要新出現的字元,自動賦值為0,size增加1;
class Solution { public: int uniqueLetterString(string S) { // char buffer[_MAX_PATH]; // _getcwd(buffer, _MAX_PATH); // string n = buffer; // n += "\\2.1.txt"; // ofstream out; // out.open(n, ios::app); // if (!out) // { // return 0; // } int ans = 0, len = 0, begin = 0 ; int s = pow(10, 9) + 7; for (int i = 0; i < S.length(); i++) { map<char,int> te; int num = 0; int j = i; for (j; j < S.length(); j++) { //cout << S.substr(i, j - i + 1) << endl; if (te[S[j]] == 1) len++; if (len == 26) { break; } te[S[j]]++; ans += te.size() - len; } len = 0; //out << i << " " << ans << "\n"; //system("cls"); } return ans; } };
網上解法:LeeCode 828. Unique Letter String
class Solution { public: int uniqueLetterString(string S) { vector<int> pos[26]; for (int i = 0; i < 26; i++) { pos[i].push_back(-1);//把邊界加入,便於計算 pos[i].push_back(S.size());//把邊界加入,便於計算 } for (int i = 0; i < S.size(); i++) { pos[S[i] - 'A'].push_back(i); } int ans = 0; for (int i = 0; i < 26; i++) { sort(pos[i].begin(), pos[i].end()); for (int j = 1; j < pos[i].size() - 1; j++) { ans += (pos[i][j + 1] - pos[i][j]) * (pos[i][j] - pos[i][j - 1]); } } return ans; } };