UVa 11062 Andy's Second Dictionary(刘汝佳紫书升级题)

╰半夏微凉° 2022-06-10 13:57 232阅读 0赞

在介绍这道题之前,先介绍一下紫书里面和这道题很像的一道题:
紫书P112页 的例题5-3 安迪的第一个字典(Andy’s First Dictionary UVa 10815)

原题链接如下:
Andy’s First Dictionary UVa 10815
AC代码如下(解析直接看紫书里的):

  1. #include<iostream>
  2. #include<string>
  3. #include<sstream>
  4. #include<set>
  5. using namespace std;
  6. set<string> dict;
  7. int main(){
  8. string s,buf;
  9. while(cin>>s){
  10. for(int i=0;i<s.size();i++){
  11. if(isalpha(s[i]))
  12. s[i]=tolower(s[i]);
  13. else
  14. s[i]=' ';
  15. }
  16. stringstream ss(s);
  17. while(ss>>buf)
  18. // cout<<buf<<endl;
  19. dict.insert(buf);
  20. }
  21. for(set<string>::iterator it=dict.begin();it!=dict.end();it++){
  22. cout<<*it<<endl;
  23. }
  24. return 0;
  25. }

弄明白上面这题后,对我们今天要AC的这道题就有帮助了。
一开始博主并不觉得有帮助,所以自己一直用暴力的方法去做,发现对于删除字符串中第一个非字母字符时,会把整个字符串删除了。一直得不到满意的解决方法。所以决定网上找题解。可惜只有一篇。用字典树做的。看起来十分复杂。决定自己搞出来。于是就决定用上面这份代码来看看有木有上面帮助。发现还真有。就是神奇的stringstream了。有了这个东西就可以在上面这份代码加上一些这道升级题的特判就可以AC了!

AC代码如下(建议前面看不懂,可以先看后面代码。代码内容相对承上启下,需要通篇看完):

  1. #include<iostream>
  2. #include<string>
  3. #include<sstream>
  4. #include<set>
  5. using namespace std;
  6. set<string> dict;
  7. int main(){
  8. string s,temp,buf;
  9. int flag=0;
  10. while(cin>>s){
  11. for(int i=0;i<s.size();i++){
  12. if(isalpha(s[i])){
  13. s[i]=tolower(s[i]);
  14. if(flag){
  15. //判断上一个字符串尾部是否带有‘-’
  16. if(s[s.size()-1]!='-'){
  17. //如果当前字符串尾部不带‘-’,说明此单词到这结束了
  18. temp+=s;//和之前的合并
  19. flag=0;//变为0
  20. break;
  21. }else{
  22. //否则继续删除尾部“-”,和之前合并。但是该单词还没有结束
  23. s.erase(s.size()-1);
  24. temp+=s;
  25. flag=1;
  26. break;
  27. }
  28. }
  29. }
  30. else if(s[i]=='-'){
  31. if(i==s.size()-1){
  32. //如果是尾部‘-’,说明单词还没有结束,需 和下一行第一个字符串合并
  33. s.erase(s.size()-1);//删除“-”
  34. temp=s;
  35. flag=1;//标记该单词还不完整
  36. break;
  37. }else{
  38. temp=s;否则直接赋值给temp
  39. break;
  40. }
  41. }else{
  42. s[i]=' ';//其他字符情况和上一题代码同样处理
  43. }
  44. if(!flag)//这里可以判断单词是否完整,完整就赋值给temp
  45. temp=s;
  46. }
  47. //这里就是和上面代码一样处理了,具体看紫书解释stringstream的用法
  48. if(!flag){
  49. stringstream ss(temp);
  50. while(ss>>buf)
  51. dict.insert(buf);
  52. }
  53. }
  54. //输出
  55. for(set<string>::iterator it=dict.begin();it!=dict.end();it++){
  56. cout<<*it<<endl;
  57. }
  58. return 0;
  59. }

发表评论

表情:
评论列表 (有 0 条评论,232人围观)

还没有评论,来说两句吧...

相关阅读

    相关 --开灯问题

    问题描述: 有n盏灯,编号为1~n,第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3 个人按下所有编号为3的倍数的开关(其中关

    相关 --周期串

    思路: 题目中说过,字符串可能有多个周期,但因为只需求出一个最小的,可以从小到大枚举各个周期,一旦符合就立刻输出;下面的变量只存在自己的循环中。 代码:

    相关 --TeX括号

    思路: 本题的关键是,如何判断一个双引号是“左”引号,还是“右”引号,使用一个标记变量即可。 代码: include<iostream>

    相关 --WERTY

    思路: 每输入一个字符,都可以直接输出一个字符,问题在于如何进行这样的变换呢?一个方法是使用if语句或者witch语句,如:if(c==‘w’)putchar(‘Q’