字符串最短循环子串 | 豆包MarsCode AI刷题

95 阅读2分钟

问题描述

  • 输入一个字符串,判断其是否完全循环,若是循环的,输出最短的循环子串,否则输出空""
  • 如输入 abababab,输出 ab;输入 ab 则输出 ""

输入格式

  • 合法字符串 如 abcabcabcabc aaa

输出格式

  • 最短的循环子串 "abc" "a"

输入样例

  • "abcabcabcabc"

输出样例

  • "abc"

数据范围

测试数据集

#include <string>

std::string solution(const std::string &inp) {
  int n = inp.size();

  for (int len = 1; len <= n / 2; ++len) {
    if (n % len == 0) {
      std::string pattern = inp.substr(0, len);
      bool isRepeating = true;

      for (int i = 0; i < n; i += len) {
        if (inp.substr(i, len) != pattern) {
          isRepeating = false;
          break;
        }
      }

      if (isRepeating) {
        return pattern;
      }
    }
  }

  return "";
}

int main() {
  // Test cases
  std::cout << (solution("abcabcabcabc") == "abc")
            << std::endl;                                 // Expected: 1 (true)
  std::cout << (solution("aaa") == "a") << std::endl;     // Expected: 1 (true)
  std::cout << (solution("ab") == "") << std::endl;       // Expected: 1 (true)
  std::cout << (solution("ababab") == "ab") << std::endl; // Expected: 1 (true)
  std::cout << (solution("abcdef") == "") << std::endl;   // Expected: 1 (true)
}

主要步骤

  1. 获取字符串长度

    • 使用 inp.size() 获取输入字符串的长度,并存储在变量 n 中。
  2. 循环尝试可能的子串长度

    • 使用 for 循环从 len = 1 到 len = n / 2,尝试所有可能的子串长度。
  3. 检查子串是否能整除字符串长度

    • 如果 n % len == 0,说明当前的 len 可能是一个有效的循环子串长度。
  4. 提取子串并检查重复性

    • 提取输入字符串的前 len 个字符作为可能的循环子串 pattern
    • 使用 for 循环检查 inp 是否由 pattern 重复构成。
  5. 返回结果

    • 如果找到重复的子串,返回该子串 pattern
    • 如果循环结束仍未找到重复子串,返回空字符串 ""

测试部分

  • 在 main 函数中,定义了多个测试用例,并输出测试结果。

代码分析

#include <iostream> #include <string>

  • 这两行代码包含了标准库的头文件。<iostream> 用于输入输出操作,<string> 用于处理字符串。
  • 定义了一个名为 solution 的函数,该函数接受一个常量引用 inp 作为参数,返回一个 std::string 类型的值。
  • 获取输入字符串 inp 的长度,并将其存储在变量 n 中。
  • 开始一个 for 循环,len 从 1 开始,直到 n / 2 结束。len 表示可能的循环子串的长度。
  • 检查 n 是否能被 len 整除。如果可以,说明 len 可能是一个有效的循环子串长度。
  • 提取 inp 的前 len 个字符作为可能的循环子串 pattern
  • 初始化一个布尔变量 isRepeating 为 true,假设 pattern 是重复的。
  • 开始一个 for 循环,i 从 0 开始,每次增加 len,直到 n 结束。
  • 检查 inp 从位置 i 开始的 len 个字符是否等于 pattern
  • 如果不相等,将 isRepeating 设为 false
  • 如果 isRepeating 为 true,说明 pattern 是重复的。
// Test cases
  std::cout << (solution("abcabcabcabc") == "abc")
            << std::endl;                                 // Expected: 1 (true)
  std::cout << (solution("aaa") == "a") << std::endl;     // Expected: 1 (true)
  std::cout << (solution("ab") == "") << std::endl;       // Expected: 1 (true)
  std::cout << (solution("ababab") == "ab") << std::endl; // Expected: 1 (true)
  std::cout << (solution("abcdef") == "") << std::endl;   // Expected: 1 (true)
}
  • 测试 solution 函数,输出测试结果。