题目:
给定字符串s,规定其变化模式为循环移位,如字符串abcd可变为dabc、cdab、bcda,现统计任一字符串变化为不同字符串的数目(包括其本身)。
思路:
首先要写一个移位函数对输入字符串进行移位,然后将移位后的字符串与之前的字符串进行比较,判断是否为新字符串。
值得注意的是,此题的解并不是字符串的长度,也不是每次移位之后与原始字符串的比较结果。例如字符串xyxy,移位后只有两种不同的字符串:xyxy和yxyx。因此,我们需要建立一个string类型的数组(字典)来存放所有不同的字符串,将每次移位后的字符串拿去和字典中已有的字符串进行比较,如有相同的字符串,则不计数,如果没有相同的字符串,则计数,并且在字典中添加此字符串。
代码如下:
// Chapter11_7.cpp : Defines the entry point for the application.
// 变化字符串的数目
// 给定字符串s,规定其变化模式为循环移位,如字符串abcd可变为dabc、cdab、bcda,
// 现统计任一字符串变化为不同字符串的数目(包括其本身)。
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
//字符串移位函数,移一位
void funShift(string &str)
{
char temp = str[0];
int strLen = str.length();
for(int i=0;i<strLen-1;i++)
{
str[i] = str[i+1];
}
str[strLen-1] = temp;
}
int main()
{
string str; //输入字符串
cout << "输入字符串" << endl;
cin >> str;
int Slen = str.length(); //输入的字符串长度
string *dicStr = new string[Slen]; //字符串字典,存放移位后各不相同的字符串
int dicNo = 1; //字典中添加元素的位置(从下标为1的位置开始添加,也可表示不相同字符串的个数)
dicStr[0] = str; //字典中的第一个字符串(下标为0)为本身字符串
int haveOne = 0; //判断字典中是否有某字符串的标准变量
for(int i=0;i<Slen;i++) //遍历所有移位情况
{
funShift(str); //移位
for(int j=0;j<dicNo;j++) //判断是否和之前移位后的字符串相同
{
//如果和字典中其它字符串相同,则break,继续移位
if(str == dicStr[j])
{
haveOne = 1;
break;
}
}
if(haveOne != 1)
{
//如果和字典中其它字符串均不相同,则在字典中添加该字符串,并将添加位置指向下一个元素
dicStr[dicNo] = str;
dicNo++;
}
}
cout << "经过变化后各不相同的字符串个数为:" << dicNo << endl;
delete []dicStr;
system("pause");
return 0;
}
运行结果如下: