1. 程式人生 > >828. 獨特字串

828. 獨特字串

828. 獨特字串

超時解法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;
	}
};