使用集合存储当前的种类,同时举例子可知长度为 i 的一共有 4^i 种

#include <iostream>
#include <cmath>
#include <unordered_set>
using namespace std;

int main() {
    string str;
    while (cin >> str) {
        int length = str.length();
        unordered_set<string> st;
        string substring;
        for (int i = 1; i <= length; i++) {
            // 清空集合,仅计算当前长度的种类数
            st.clear();
            // 遍历并截取对应长度的字符,插入集合中
            for (int j = 0; j < length - i + 1; j++) {
                substring = str.substr(j, i);
                st.insert(substring);
            }
            // 长度为 i 的种类总数是 4^i
            if (st.size() != pow(4, i)) {
                cout << i << endl;
                break;
            }
        }
    }
    return 0;
}

时间复杂度:

1、最外层while循环会根据输入的字符串进行迭代,时间复杂度取决于输入字符串的长度,设为n

2、外层遍历所有可能的子字符串长度,时间复杂度为O(n);内层遍历字符串的所有可能起始位置,时间复杂度为O(n)

综上所述,总时间复杂度为O(n^2)

空间复杂度:

1、字符串变量str的空间复杂度为O(n)

2、无序集合st的空间复杂度取决于子字符串的数量,最坏情况下为O(n^2)

综上所述,总空间复杂度为O(n^2)