算法笔记学习记录——字符串

算法笔记学习记录——字符串

字符串

这是我学习算法笔记的记录性质的博客,记录我寒假学习算法笔记的过程。

WERTYU

把手放在键盘上时,稍不注意就会往右错一位。这样的话,Q就会变成W,J变成K等。
输入一个错位后敲出的字符串,输出打字员原本想打出的句子。
样例输入
O S, GOMR YPFSU/
样例输出
I AM FINE TODAY.
分析
没吃输入一个字符,都能输出一个字符,但是问题在于:如何进行变换嘞?如果用IF语句也不是不行,但是那时一种比较麻烦的方法,显然不可取。于是我们可以采用数组储存的方式,这样使用电脑判断显然比手打舒服多了。
代码:

#include <iostream>
#include <stdio.h>
using namespace std;
string s="QWERTYUIOP[]\ASDFGHJKL;'ZXCVBNM,./";
int main()
{
    int i,c;
    while((c=getchar())!=EOF)//getchar 和scanf还有cin<<无输入的时候会返回EOF,即-1.windows下按ctrl+z可实现输入EOF。
    {
        for(i=1;s[i]&&s[i]!=c;i++);//for语句第一个:前是初始值,第二个是循环条件。此句功能为找到输入字符在s中的位置
        if(s[i]) putchar(s[i-1]);//如果它前面有值就输入前面的
        else putchar(c);//如果没有就输入它本身,例如QAZ
    }
    return 0;
}

括号

在中文中,左双括号是“ ”,右括号是“ ”,现在又一篇英文的文章,你的任务是把它的""转换成中文的“”。
样例输入:
“to be or not to be”,quoth the bard,“that is the question”.
样例输出:
“to be or not to be”,quoth the bard,“that is the question”.
分析:
设置一个标志变量即可判断双引号是左还是右了
代码:

#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
    int c,q=1;//控制变量
    while((c=getchar())!=EOF){
        if(c=='\"'){
            printf("%s",q?"“":"”");
            q=!q;//q为1表示左,0为右
        }else
        {
            printf("%c",c);
        }
    }
    return 0;
}

周期串

如果一个字符串可以由某个长度为k的字符串重复多次得到,我们就说该串以为周期。例如,abcabcabcabc以3为周期(注意,它也以6和12为周期)。输入一个长度不超过80的串,输出它的最小周期。
例如:
输入:HOHOHO
输出:2
分析:
一种比较容易懂的方法:遍历循环判断最小周期。
判断方法:for语句从1开始到字符串长度。我们不难发现只有能被字符串长度整除时,才可能时最小周期,所以可以用if语句进行筛选。其次,筛选方法也比较机械,就是从周期的地址开始往后面一个字符一个字符的与第一个周期内的字符比较。
这里我们可以巧用 % 符号,例如:j%5的结果不论j一直加到多少它都是在5以内循环的。
代码:

#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
int main()
{
    string word;
    cin>>word;
    for(int i=1;i<=word.size();i++){//从1开始枚举
        if(word.size()%i==0){//只有被总数整除,才可能是最小周期
            int ok = 1;
            for(int j=i;j<word.size();j++){//从第i个开始比较
                if(word[j]!=word[j%i]){//每次都与第1个周期内的字符串循环比较,如果都不相等直接退出。
                    ok=0;
                    break;
                }
            }
            if(ok){//如果上面全部对比完成后,ok还是1,它就是最小周期了。
                cout<<i<<endl;
                break;
            }
        }
    }
    return 0;
}

发布了25 篇原创文章 · 获赞 20 · 访问量 3263

猜你喜欢

转载自blog.csdn.net/qq_44886056/article/details/103990425