今天做的两道题都是有关two pointers的。
1.leetcode125
这一题虽然是easy题,但我做的并不好。主要是边界条件一直没有理顺,一直出错,慢慢debug才发现自己的错误。
class Solution {
public:
bool isPalindrome(string s) {
int begin = 0;
int end = s.size()-1;
bool flag = true;
while(begin<end){
while(!isalpha(s[begin])&&!isdigit(s[begin])&&begin<s.size()-1){
begin++;
}
while(!isalpha(s[end])&&!isdigit(s[end])&&end>0){
end--;
}
if(begin>=end){
break;
}
else if(isalpha(s[begin])&&isalpha(s[end])){
if(tolower(s[begin])==tolower(s[end])){
begin++;
end--;
continue;
}else{
flag = false;
break;
}
}else if(isdigit(s[begin])&&isdigit(s[end])){
if(s[begin]==s[end]){
begin++;
end--;
continue;
}else{
flag = false;
break;
}
}else{
flag = false;
break;
}
}
return flag;
}
};
但是我看到别人的解决方法有比我更清晰的:
class Solution {
public:
bool isPalindrome(string s) {
int start=0;
int end=s.size()-1;
while(start<=end){
if(!isalnum(s[start])){start++; continue;}
if(!isalnum(s[end])){end--;continue;}
if(tolower(s[start])!=tolower(s[end]))return false;
else{
start++;
end--;
}
}
return true;
}
};
while里套while就引入了更多的边界条件,容易出错。不如只套if,善于利用continue。
2.leetcode392
这一题也是个easy题,直接秒杀,没什么可说的。
class Solution {
public:
bool isSubsequence(string s, string t) {
int s_pointer = 0;
int s_n = s.size();
int t_pointer = 0;
int t_n = t.size();
while(s_pointer<s_n&&t_pointer<t_n){
if(s[s_pointer]==t[t_pointer]){
s_pointer++;
t_pointer++;
}else{
t_pointer++;
}
}
if(s_pointer==s_n){
return true;
}else{
return false;
}
}
};
3.leetcode167
这一题是一道medium,我一开始的方法超时了:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int n=numbers.size();
vector<int> ans;
int j_flag=n-1;
for(int i=0;i<n;i++){
int j=i+1;
while(numbers[i]+numbers[j]<target&&j<j_flag){
j++;
}
j_flag=j;
if(numbers[i]+numbers[j]==target){
ans.push_back(i+1);
ans.push_back(j+1);
break;
}
}
return ans;
}
};
我这个算法的时间复杂度为O(n^2)。虽然我引入了一个j_flag,但是并没有把时间复杂度降低一个量级。一个更好的方法:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int n=numbers.size();
vector<int> ans;
int l=0;
int r=n-1;
while(l<r){
if(numbers[l]+numbers[r]<target){
l++;
}else if(numbers[l]+numbers[r]>target){
r--;
}else{
ans.push_back(l+1);
ans.push_back(r+1);
break;
}
}
return ans;
}
};
总和小于目标,左边移;总和大于目标,右边移。时间复杂度为O(n)。