3题,无重复最长字符子串
思路:贪心算法。
具体细节见代码中的注释。
代码:
class Solution {
public:
int lengthOfLongestSubstring(string s) {
vector<int> v(140, 0);
if(s.size() == 0)
return 0;
int begin = 0, end = 0;
int max = 0;
while (1)
{
int i = begin;
for ( i = begin; i < s.size(); i++)
{
v[s[i]]++;
if (v[s[i]] == 2)
{
end = i - 1;
break;
}
end = i; //不断更新终点
}
if (end - begin + 1> max)
max = end - begin + 1;
if (end == s.size() - 1) //到终点时候结束
break;
//回到,更新起点
for (int j = i - 1; j >= 0; j--)
{
if (s[j] == s[i])
{
begin = j + 1;
break;
}
}
//重新赋值
for (int k = 0; k < v.size(); k++)
v[k] = 0;
}
return max;
}
};
5题,最长回文子串
思路:暴力解法,
分为两种情况。
1,中心为一个字母,进行延伸。
2,中心为两个字母,进行延伸。
代码:
class Solution {
public:
pair<int, int> expandAroundCenter(const string& s, int left, int right) {
while (left >= 0 && right < s.size() && s[left] == s[right]) {
--left;
++right;
}
return { left + 1, right - 1 };
}string longestPalindrome(string s) {
int start = 0, end = 0;
for (int i = 0; i < s.size(); ++i) {
auto p1 = expandAroundCenter(s, i, i);
auto p2 = expandAroundCenter(s, i, i + 1);
auto right1 = p1.second; auto left1 = p1.first;
auto right2 = p2.second; auto left2 = p2.first;
if (right1 - left1 > end - start) {
start = left1;
end = right1;
}
if (right2 - left2 > end - start) {
start = left2;
end = right2;
}
}
return s.substr(start, end - start + 1);
}
};
总结:这两题对于菜鸟的我还是挺难的,今天做的题有点少,明天加油,在多做点。🤗