写在前面:本文题单均来自力扣的算法刷题计划,开这个系列主要是以题目与题解的形式对一些常见、常用算法进行归类和总结,希望在促进自己学习的同时也能帮助到看到这篇文章的大家。另外,本文并非一天一更~(中间遇到一些变故,现在结束了)
目录
题目一:3. 无重复字符的最长子串
题目描述:
题目分析:
这题的方法是运用双指针滑动窗口,先用一个数组和一个右指针从左往右依次记录字符串每个字符的出现次数,若出现某个字符出现的次数大于 1 的情况,则左指针右移 1 位,使得 j - i + 1 (即当前无重复子串的长度)的值不变,最后取其最大值即可。
题解代码:
class Solution {
public:
int a[130];
int lengthOfLongestSubstring(string s) {
int max=0,n=s.size();
for(int i=0,j=0;j<n;j++)
{
a[s[j]]++;
while(a[s[j]]>1)
{
a[s[i++]]--;
}
if(j-i+1>max)
{
max=j-i+1;
}
}
return max;
}
};
题目二:567. 字符串的排列
题目描述:
题目分析:
这题我们使用 s1 的字符串在 s2 里逐一匹配即可,对于会有连续的字符串相同但字符顺序不同的情况,使用 sort 函数排序后再进行比对。
题解代码:
class Solution {
public:
bool checkInclusion(string s1, string s2) {
if(s1.size()>s2.size())
return false;
sort(s1.begin(),s1.end());
int n=s1.size();
for(int i=0;i<=s2.size()-n;i++)
{
string temp=s2.substr(i,n);
sort(temp.begin(),temp.end());
if(temp==s1)
return true;
}
return false;
}
};