44. Wildcard Matching
来自:leetcode44
模糊匹配问题
思路很简单:从头开始匹配,遇到“*”就在字符串s中继续找能够匹配字符串p的下一个字符的字符,同时需要记住当前星号的位置,以便回溯。
bool isMatch(string s, string p) {
int sl=s.size(),pl=p.size();
int i=0,j=0;
int lasts=-1,lastp=-1;
while(i<sl){
//相等(包括存在"?"的情况)时,继续向后比较
if(j<pl&&(s[i]==p[j]||p[j]=='?')){
i++;
j++;
}
//存在"*"时,继续比较s和p中"*"的下一个字符,此时p的位置固定
else if(j<pl&&p[j]=='*'){
lastp=j++;
lasts=i;
}
//如果上述两种情况都不符合,回溯,回到"*"的下一个位置继续与s后面的字符比较
else if(lasts>=0){
i=++lasts;
j=lastp+1;
}
//均不符合则不匹配
else return false;
}
//考虑字符串p末尾有"*"的情况
while(j<pl && p[j]=='*')
j++;
return (j==pl);
}
134. Gas Station
来自:leetcode134
因为构成一个圆环,所以开始将两个数组分别复制一份加在末尾;
从头开始找cost[i]<=gas[I]的点,找不到直接返回-1;
找到之后开始依次看能否到达下一个点(若当前点不能到达,就直接将下一个点作为起始点)
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int len=gas.size();
gas.insert(gas.end(),gas.begin(),gas.end());
cost.insert(cost.end(),cost.begin(),cost.end());
int lmp=-1,i;
int carGas=0;
for (i=0;i<len;i++){
if(cost[i]<=gas[i]) {
lmp=i;
break;
}
}
if(i==len)
return -1;
for(i;i<2*len;i++){
if(carGas+gas[i]>=cost[i]){
carGas=carGas+gas[i]-cost[i];
}
else if(lmp>=0 && lmp<len-1){
lmp=i+1;
carGas=0;
}
else return -1;
if(i==(len+lmp-1))//绕了一圈回来之后,后面多余的就不用看了
return lmp;
}
return -1;//这里不加会报错
}
*贪心感想:按照第一思路解题,遇到特殊点就解决