C++字符串基础练习18-20题

字符串乘方

给定两个字符串 a 和 b,我们定义 a×ba×b 为他们的连接。

例如,如果 a=abc 而 b=def, 则 a×b=abcdef

如果我们将连接考虑成乘法,一个非负整数的乘方将用一种通常的方式定义:a0=``(空字符串),a(n+1)=a×(an)。注意这里的0,n+1和n均为上标的形式。

输入格式

输入包含不超过 10 组测试样例,每组测试样例占一行。

每组样例包含一个由小写字母构成的字符串 s,s 的长度不超过 100,且不包含空格。

最后的测试样例后面将是一个点号作为一行。

输出格式

对于每一个 s,你需要输出最大的 n,使得存在一个字符串 aa,让 s=an。

输入样例:
abcd
aaaa
ababab
.
输出样例:
1
4
3
#include 
#include 
using namespace std;

void findNum(string str) {
    int len = str.size();
    for (int i = 1; i <= len; i++) { 
        if (len % i != 0) {
            continue;
        }
        // 判断一个字符串是否是周期字符串
        bool isPeriod = true;
        for (int j = 0; j < len; j++) {
            if (str[j] != str[j % i]) {
                isPeriod = false;
                break;
            }
        }
        // 计算它的最小周期重复次数
        if (isPeriod) {
            cout << len / i << endl;
            return;
        }
    }
    cout << 1 << endl;  // 处理无周期的情况
}
int main() {
    string str;
    while (cin >> str) {
        if (str[0] == '.') {
            break;
        }
        findNum(str);
    }
    return 0;
}

代码思路解析

这段代码解决的问题是:​​给定一个字符串s,找出最大的整数n,使得存在一个字符串a,满足s = aⁿ(即字符串a重复n次等于s)​​。

核心思路
  1. ​理解字符串幂的定义​​:

    • aⁿ表示字符串a重复n次,例如a="ab",则a²="abab"。
    • 题目要求找出最大的n,使得s可以被某个基串a重复n次构成。
  2. ​关键观察​​:

    • 如果s可以由a重复n次构成,那么:
      • s的长度必须是a长度的整数倍(即len(s) % len(a) == 0),而这里的i便代表了基串a的长度。
      • s必须完全由a的重复构成(即s的每个字符必须与a中对应位置的字符一致)。
  3. ​算法设计​​:

    • 遍历所有可能的基串长度i(从1到len(s)):
      • 检查i是否能整除s的长度(len(s) % i == 0)。
      • 检查s是否由前i个字符(即候选基串a = s[0..i-1])重复构成。
    • 找到满足条件的最大n(即len(s)/i的最小i)。
代码实现步骤
  1. ​遍历所有可能的基串长度i​​:

    • i从1到len(s),代表可能的基串a的长度。
    • 如果len(s)不能被i整除,跳过(因为无法均匀分割)。
  2. ​检查周期性​​:

    • 对于每个候选i,检查s是否由s[0..i-1]重复构成:
      • 遍历s的每个字符s[j],检查是否等于s[j % i](即基串的对应位置字符)。
      • 如果所有字符都匹配,则i是一个合法的基串长度。
  3. ​输出结果​​:

    • 找到最小的合法i(即最大的n = len(s)/i),输出n。
    • 如果没有找到(即s是非周期串),输出1(基串为s本身)。
示例分析
  • 输入s = "ababab":
    • len=6,检查i=1,2,3,6:
      • i=2:基串a="ab",检查s是否等于"ab"重复3次("ababab"),成立。
      • 输出n=3(因为6/2=3)。

你可能感兴趣的:(C++字符串基础练习18-20题)