📌  相关文章
📜  C ++程序检查是否可以通过将另一个字符串旋转d个位置来获得一个字符串(1)

📅  最后修改于: 2023-12-03 14:39:39.477000             🧑  作者: Mango

C++程序检查字符串是否可通过旋转获得

本程序用于检查一个字符串是否可以通过将另一个字符串旋转d个位置来获得。该算法使用了字符串的循环移位和比较操作。

算法思路

我们可以将字符串重复复制一遍并将其首尾相接,然后找到这个复制后的字符串中,与原字符串相同的子字符串,并比较它们的索引位置是否相差d。如果存在这样的子字符串,则说明可以通过旋转获得该字符串。

举例说明

假设原字符串是 "abcde",我们将其复制并拼接一起,得到字符串 "abcdeabcde"。然后我们在这个字符串中查找 "bcde",发现它的索引位置分别是 1 和 6。它们的差值为 5,也就是字符串长度减去旋转的长度。因此可以通过将字符串旋转5个位置得到原字符串。

代码实现

以下是实现该算法的C ++代码。其中,函数 isRotation() 接受两个字符串作为参数,并返回一个布尔值,表示第一个字符串是否可以通过旋转得到第二个字符串。

#include <iostream>
#include <string>
using namespace std;

bool isRotation(string s1, string s2) {
    if(s1.length() != s2.length()) return false;   // 长度不同则不可能旋转得到
    s2 += s2;   // 将字符串s2复制并拼接一起
    return s2.find(s1) != string::npos;    // 查找s1是否存在于s2中
}

int main() {
    string s1, s2;
    cout << "请输入两个字符串,以空格分隔:";
    cin >> s1 >> s2;
    if(isRotation(s1, s2)) cout << "可以通过旋转得到" << endl;
    else cout << "不可以通过旋转得到" << endl;
    return 0;
}
总结

本算法利用字符串的特性,通过将字符串复制、拼接、查找等操作,实现了高效地检查一个字符串是否可以通过旋转获得。在实际应用中,可以用来判断两个数组是否循环同构,或者判断两个字符串是否相互旋转。