📅  最后修改于: 2023-12-03 15:29:43.194000             🧑  作者: Mango
本文将介绍如何使用C++程序通过避免一组给定字符串来查找最小循环旋转以获得给定数字字符串。在本文中,我们将解释算法的工作原理,并提供示例代码和完整的代码片段。
最小循环旋转是将字符串旋转一定数量的角度后,使其成为其自身的子序列的最小旋转。例如,字符串“abcdefg”的3个最小循环旋转是“defgabc”,“efgabcd”和“fgabcde”。
该算法的工作原理基于一个简单的事实:如果两个字符串是循环旋转相同的,那么它们通常可以通过将它们相邻的字符相加来相等。因此,我们可以通过比较给定字符串和其所有循环旋转,找到最小循环旋转。
算法使用以下步骤:
初始化一个字符串变量为给定数字的字符串。
初始化一个空的字符串变量为最小循环旋转。
循环遍历字符串的每一个字符。
循环遍历其余的所有字符,将它们添加到最小循环旋转字符串中。
将最小循环旋转字符串与给定数字字符串进行比较。如果它们相等,则我们找到了最小循环旋转。
如果未找到最小循环旋转,则将字符串向左移动一位,并重复步骤2-5。
以下是C++程序的代码实现,它采用上述算法并接受一个字符串作为输入:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string findMinRotation(string num) {
string minRotation = num;
for (int i = 0; i < num.length(); i++) {
string rotation = num.substr(i) + num.substr(0, i);
if (minRotation.compare(rotation) > 0) {
minRotation = rotation;
}
}
return minRotation;
}
bool avoidsSet(string num, string avoidingSet[], int avoidingSetSize) {
for (int i = 0; i < avoidingSetSize; i++) {
if (num.find(avoidingSet[i]) != string::npos) {
return false;
}
}
return true;
}
string findMinRotationAvoidingSet(string num, string avoidingSet[], int avoidingSetSize) {
string minRotation = num;
while (!avoidsSet(minRotation, avoidingSet, avoidingSetSize)) {
minRotation = findMinRotation(minRotation.substr(1) + minRotation[0]);
}
return minRotation;
}
int main() {
string num = "1234567890";
string avoidingSet[] = {"2468", "16", "69"};
string minRotation = findMinRotationAvoidingSet(num, avoidingSet, 3);
cout << minRotation << endl;
return 0;
}
此程序采用两个函数:findMinRotation
和findMinRotationAvoidingSet
。findMinRotation
函数接受一个字符串并返回其最小循环旋转。findMinRotationAvoidingSet
函数接受一个字符串和一个字符串数组,该数组包含应避免的子字符串列表,并在找到最小循环旋转时返回该字符串。否则,它将继续通过调用findMinRotation
函数来进行测试。
示例代码实现了以下场景:“1234567890”的最小循环旋转,该字符串包含避免字符串集(“2468”,“16”,“69”)。
在本文中,我们介绍了使用C++程序查找最小循环旋转的算法,并通过提供示例来说明如何应用该算法。我们还展示了如何通过避免一组给定字符串来查找最小循环旋转。这种算法的应用有很多,包括密码破解、差异分析和DNA分析。