你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。
你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True。
示例 1:
输入:name = "alex", typed = "aaleex" 输出:true 解释:'alex' 中的 'a' 和 'e' 被长按。
示例 2:
输入:name = "saeed", typed = "ssaaedd" 输出:false 解释:'e' 一定需要被键入两次,但在 typed 的输出中不是这样。
示例 3:
输入:name = "leelee", typed = "lleeelee" 输出:true
示例 4:
输入:name = "laiden", typed = "laiden" 输出:true 解释:长按名字中的字符并不是必要的。
提示:
name.length <= 1000 typed.length <= 1000 name 和 typed 的字符都是小写字母。
class Solution { public: bool isLongPressedName(string name, string typed) { //首先 相同时肯定是对的 if(name==typed) return true; if(typed.size()<name.size()) return false; //在字母相同的情况下,转化成求最长公共子序列可以,但麻烦 //既然只能边走边计数,那就再来一次吧[哭] int i=0,j=0; while(i<name.size()&&j<typed.size()) { int count1=0; int count2=0; char temp=name[i]; while(name[i]==temp) { count1++; i++; } if(typed[j]!=temp) return false; while(typed[j]==temp) { count2++; j++; } if(count2<count1) return false; } if(j<typed.size()) return false; if(i<name.size()) return false;//j虽然长,但是有少打的这种情况。 return true; } };之前弯路1:(具体看注释)
/* int i=0; int j=0; while(i<name.size())//是的,一次性把重复的走完,但实际上远名字中重复的没走完,自然就不想等,就返回flase了。不适用于原名字中有重复字符的情况。 { if(typed[j]!=name[i]) return false; while(typed[j]==name[i]) { cout<<typed[j]<<" "; j++; } cout<<endl; i++; } while(j<typed.size()) { if(typed[j]!=name[name.size()-1]) return false; } return true; */之前弯路2:(具体看注释)
/* //既然没有时间和空间复杂度的要求,那就用笨办法啦! int count1[26]; int count2[26]; for(int i=0;i<26;i++) { count1[i]=0; count2[i]=0; } for(int i=0;i<name.size();i++) { count1[name[i]-'a']++; } for(int i=0;i<typed.size();i++) { count2[typed[i]-'a']++; } //for(int i=0;i<name.size();i++) //{ // cout<<count1[i]+'a'<<" "; //} //cout<<endl; for(int i=0;i<26;i++) { string str; str+=i+'a'; cout<<str<<count1[i]<<" "; } cout<<endl; for(int i=0;i<26;i++) { string str; str+=i+'a'; cout<<str<<count2[i]<<" "; } cout<<endl; int i=0,j=0; while(i<name.size()) { if(name[i]!=typed[j]) { cout<<"1"<<endl; cout<<name[i]<<" "<<typed[j]<<endl; return false; } else if(count1[name[i]-'a']>count2[typed[j]-'a']) { cout<<"2"<<endl; return false; } i+=count1[name[i]-'a'];//不能用总的count啊!因为后面,只能边走边计数。 j+=count2[typed[j]-'a']; } if(j<typed.size()) { cout<<"3"<<endl; return false; } return true; */