string的基本操作函数要会,拷贝,查找
HW笔试第一题,两个字符串,前面是全量字符集,后面是已占用字符集(用@隔开),输出剩余的字符集。
1 #include<iostream> 2 #include<map> 3 using namespace std; 4 string stringoperate(string str1,string str2) 5 { 6 int len1=str1.size(); 7 int len2=str2.size(); 8 if(len2==0) 9 return str1; 10 map<char,int> mp; 11 //存入map 12 for(int i=0;i<len1;i=i+4) 13 { 14 mp[str1[i]]=str1[i+2]-'0';//字符串转数字 15 } 16 for(int i=0;i<len2;i=i+4) 17 { 18 mp[str2[i]]-=str2[i+2]-'0'; 19 } 20 //修改string 21 for(int i=0;i<len1;i=i+4) 22 { 23 str1[i+2]=mp[str1[i]]+'0'; 24 } 25 return str1; 26 } 27 void stringdivid() 28 { 29 string str; 30 //string str="a:3,b:5,c:2@a:1,b:2"; 31 cin>>str; 32 int sig=str.find('@');//寻找@的下标 33 //分割字符串成两个 34 string str1(str,0,sig); 35 string str2(str,sig+1); 36 string result; 37 result=stringoperate(str1,str2); 38 39 cout<<result; 40 } 41 int main() 42 { 43 stringdivid(); 44 return 0; 45 }
这是我在牛客上找的一个练习题:
题目:
1. 三个同样的字母连在一起,一定是拼写错误,去掉一个的就好啦:比如 helllo -> hello
2. 两对一样的字母(AABB型)连在一起,一定是拼写错误,去掉第二对的一个字母就好啦:比如 helloo -> hello
3. 上面的规则优先“从左到右”匹配,即如果是AABBCC,虽然AABB和BBCC都是错误拼写,应该优先考虑修复AABB,结果为AABCC
解法:
快慢指针,i代表快指针,j代表慢指针,如果满足条件1或2,慢指针就不动,快指针一直走到尾就结束。
1 #include<iostream> 2 using namespace std; 3 4 void StrOperation() 5 { 6 string str; 7 int n; 8 cin>>n; 9 while(n--) 10 { 11 cin>>str; 12 int j=0; 13 for(int i=0;i<str.size();i++) 14 { 15 str[j++]=str[i]; 16 if(j>=3&&str[j-2]==str[j-1]&&str[j-2]==str[j-3]) 17 { 18 j--;//这一句代表前面15行的赋值是无效的,因为下一个for循环还会给同样的j赋值,而赋的值是下一个元素 19 } 20 if(j>=4&&str[j-4]==str[j-3]&&str[j-2]==str[j-1]) 21 { 22 j--; 23 } 24 } 25 str.erase(str.begin()+j,str.end());//删除j位置后的所有元素 26 cout<<str<<endl;; 27 } 28 } 29 int main() 30 { 31 StrOperation(); 32 return 0; 33 }