#925长键按入 easy
mycode:思路就是遇到重复的,name一边跳过一边数有几个,typed也一边跳过一边数,typed的数量要>=name的
bool isLongPressedName(string name, string typed) {
int i=0; int j=0;
int cnt1, cnt2;
while(1){
if(name[i]!=typed[j]) return false;
cnt1=1;
while(i+1<name.size() && name[i]==name[i+1]){
cnt1++;
i++;
}
cnt2=1;
while(j+1<typed.size() && typed[j]==typed[j+1]){
cnt2++;
j++;
}
if(cnt2<cnt1) return false;
i++; j++;
if(i>=name.size()||j>=typed.size()) break;
}
if(i==name.size() && j==typed.size()) return true;
return false;
}
随想录思路也差不多,但觉得比我的麻烦,就没放了
#844比较退格的字符串 easy
容易方法容易,难方法难(不能用额外空间的)
容易方法:用stack,非常擅长匹配消除问题
我的code:
bool backspaceCompare(string s, string t) {
stack<char> st;
for(char &c:s){
if(c=='#' && !st.empty()) st.pop();
else if(c!='#') st.push(c);
}
s="";
while(!st.empty()){
s+=st.top();
st.pop();
}
for(char &c:t){
if(c=='#' && !st.empty()) st.pop();
else if(c!='#') st.push(c);
}
t="";
while(!st.empty()){
t+=st.top();
st.pop();
}
//cout<<"s: "<<s<<", t:"<<t<<endl;
return s==t;
}
但随想录是 pop和放到result里合并在一起了。而且使用的string当做stack来用,也很好:
string 可以用 pop_back() 和 += ,很方便
bool backspaceCompare(string S, string T) {
string s; // 当栈来用
string t; // 当栈来用
for (int i = 0; i < S.size(); i++) {
if (S[i] != '#') s += S[i];
else if (!s.empty()) {
s.pop_back();
}
for (int i = 0; i < T.size(); i++) {
if (T[i] != '#') t += T[i];
else if (!t.empty()) {
t.pop_back();
}
}
if (s == t) return true; // 直接比较两个字符串是否相等,比用栈来比较方便多了
return false;
}
难的方法 空间O1 的,看了随想录思路自己实现的:
并没有真正地修改字符串S,而是通过调整skip和i的值,来模拟处理了'#'字符(即退格键)的影响
然后我一开始最外面的while条件不对,要注意
bool backspaceCompare(string s, string t) {
int skips=0;
int skipt=0;
int i=s.size()-1;
int j=t.size()-1;
while(1){
while(i>=0){
if(s[i]=='#') skips++;
else{
if(skips>0) skips--;
else break;
}
i--;
}
while(j>=0){
if(t[j]=='#') skipt++;
else{
if(skipt>0) skipt--;
else break;
}
j--;
}
if(j<0||i<0) break;
if(s[i]!=t[j]) return false;
i--; j--;
}
if(i==-1 && j==-1) return true;
return false;
}