不同整数的计数问题(题解)字符串最短循环子串(题解)

79 阅读3分钟

问题描述

小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。

例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123""34""8" 和 "34"。不同的整数有三个,即 "123""34" 和 "8"

注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。

测试样例

样例1:

输入:word = "a123bc34d8ef34"
输出:3

样例2:

输入:word = "t1234c23456"
输出:2

样例3:

输入:word = "a1b01c001d4"
输出:2

解题思路:

找到字符串中的每一个数字串, 将其转换为对应十进制的数字存入map

最后map的size即为不同整数的个数

考虑到要消除前导0 和0也有效

用flag来标志是否读取到了数字

读取到了数字就在该数字串结束(或读到字符串结束)时将其存入map

#include <iostream>
#include <map>
#include <string>

using namespace std;

int solution(string word) {
  int len = word.size();
  int num = 0;
  map<int, int> mp;
  bool f = false;
  for (int i = 0; i < len; i++) {
    if (isdigit(word[i])) {
      num = num * 10 + (word[i] - '0');
      f = true;
    } else if (f) {
      mp[num]++;
      num = 0;
      f = false;
    }
    if (i == len - 1 && num != 0) {
      mp[num]++;
    }
  }

  return mp.size();
}

int main() {
  cout << (solution("a123bc34d8ef34") == 3) << endl;
  cout << (solution("t1234c23456") == 2) << endl;
  cout << (solution("a1b01c001d4") == 2) << endl;

  return 0;
}

问题描述

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

输入格式

  • 合法字符串 如 abcabcabcabc aaa

输出格式

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

输入样例

  • "abcabcabcabc"

输出样例

  • "abc"

要判断一个字符串是否完全循环,并找出最短的循环子串,可以采用以下步骤来实现:

思路 定义完全循环:一个字符串被认为是完全循环的,如果它可以表示为一个子串重复若干次而形成的。例如,abababab可以看作ab重复了4次。 求解方法: 首先,计算字符串的长度 𝑛 n。 然后,遍历所有可能的子串长度 𝑚 m(从1到 𝑛 / 2 n/2),并检查是否 𝑛 n 能被 𝑚 m 整除。 对于每个有效的 𝑚 m,提取子串 s[0:m],并构建一个新字符串,通过重复这个子串 𝑛 / 𝑚 n/m 次来检查是否与原字符串相等。 如果找到这样一个子串,返回该子串;如果没有,则返回空字符串 ""。 实现步骤 输入字符串。 初始化字符串长度 𝑛 n。 循环检查各个可能的子串长度 𝑚 m。 构造新字符串并进行比较。 输出结果。

#include <iostream>
#include <string>

std::string solution(const std::string &inp) {
    for (int len = 1; len <= inp.size() / 2; ++len) {
        std::string pattern = inp.substr(0, len);
        bool isCyclic = true;
        for (int i = 0; i < inp.size(); i += len) {
            if (inp.substr(i, len) != pattern) {
                isCyclic = false;
                break;
            }
        }
        if (isCyclic) {
            return pattern;
        }
    }
    return "";
}

int main() {
    // 添加你的测试用例
    std::cout << (solution("abcabcabcabc") == "abc") << std::endl;
    std::cout << (solution("abababab") == "ab") << std::endl;
    std::cout << (solution("aaa") == "a") << std::endl;
    std::cout << (solution("ab") == "") << std::endl;
    return 0;
}