字符串- 题意理解与转换

来源:互联网 发布:airdroid知乎 编辑:程序博客网 时间:2024/05/22 15:23

*POJ*1822古代密码

!!!一定要理解题意……审题审题审题
一开始理解成了所有的元素替换成自己或者自己+1
写了一版

#include <iostream>#include <string.h>#include <algorithm>using namespace std;const int N = 108;bool match(char c1, char c2){    if(c1 == c2) return true;    if(c1 < 'Z' && c1 + 1 == c2) return true;    if(c1 == 'Z' && c2 == 'A') return true;    return false;}char s1[N],s2[N];bool judge(){    int len1 = strlen(s1), len2 = strlen(s2);    if(len1 != len2) return false;    int flag = 1;    sort(s1, s1 + len1);    sort(s2, s2 + len1);    // printf("s1:%s\n",s1);    // printf("s2:%s\n",s2);    for(int i = 0; i < len1; i++)    {        if (match(s2[i],s1[i]) == false)        {              flag = 0;            //printf("i:%d s2[i]:%c s1[i]:%c", i, s2[i], s1[i]);            break;        }    }    if(flag == 1) return true;    while(s2[len1-1] == 'Z')    {        flag = 1;        s2[len1 - 1] = 'A';        sort(s1, s1 + len1);        sort(s2, s2 + len1);        // printf("s1:%s\n",s1);        // printf("s2:%s\n",s2);        for(int i = 0; i < len1; i++)        {            if (match(s2[i],s1[i]) == false)            {                  flag = 0;                break;            }        }           if(flag == 1) return true;    }    return false;}int main(){#ifndef ONLINE_JUDGE    freopen("input.txt", "r", stdin);    freopen("output.txt", "w", stdout);#endif    cin >> s1 >> s2;    if(judge() == true)        printf("YES\n");    else printf("NO\n");    #ifndef ONLINE_JUDGE    fclose(stdin); fclose(stdout);#endif    return 0;}

当然这一版也加深了一些我对字符串处理的思考。
我觉得有个博主写得很好
http://blog.csdn.net/hengbao4/article/details/46563269
关注

  • 数量变化
  • 质量变化
  • 属性变化

  • 打乱顺序- 可以考虑是不是能用排序抵消这种变化

  • 如果是 + 1替换的话 - 可以考虑是不是特殊处理Z即可

在这道题里,我们发现,只需要统计它的数目就可以知道匹配与否。

也涉及到一个非常常用的方法 ,在统计的数目不多的时候,直接给每一个字母开一个数组统计数量即可
但是写的时候一直出bug

#include <iostream>#include <string.h>#include <algorithm>#include <stdio.h>using namespace std;char s1[200],s2[200];int num1[26],num2[26];int main(){    cin >> s1 >> s2;    int len1 = strlen(s1), len2 = strlen(s2);    for(int i = 0; i < len1; i++)    {        num1[s1[i] - 'A']++;    }    for(int i = 0; i < len2; i++)    {        num2[s2[i] - 'A']++;    }    sort(num1,num1 + 26);    sort(num2,num2 + 26);    for(int i = 0; i < 26; i++)    {        if(num1[i] != num2[i])//大括号!!!!!!!        {            cout << "NO" << endl;            return 0;        }    }    cout << "YES" << endl;     return 0;}

debug了好久好久……发现是if没有加大括号!!!!

原创粉丝点击