检查任何字符串的左移和右移是否会得到给定的字符串


字符串数据类型由字符集合表示。它使用字母、数字、符号和空格进行逻辑排列。大多数计算机语言使用单引号或双引号括起字符串,以将其与其他数据类型区分开来。

程序员经常使用字符串执行一些输入和输出操作、文本数据的存储和操作等。字符串上的一些常见操作包括连接(组合两个或多个字符串)、子字符串提取(获取字符串的一部分)以及在字符串中搜索特定字符或模式。

方法

我们可以使用以下方法来确定字符串的左移和右移是否会得到每个字符串:

方法 1. 暴力法

方法 2. 检查子字符串

方法 1:暴力法

使用暴力法,生成输入字符串的所有左移和右移,然后将每个与目标字符串进行比较。此方法的时间复杂度为 O(n2),其中 n 是字符串的长度。

语法

确定任何字符串的左移和右移是否会得到给定字符串的暴力法是遍历原始字符串的所有可能的左移和右移,并将它们与给定字符串进行比较。此策略的通用语法如下:

string_shift_check (original_string, given_string):
   n = length of original string
   for int i from 0 to n-1:
      left shift = original string[i:n] + original string[0:i]
      right shift = original string[n-i:n] + original string[0:n-i]
      if left shift == given string or right shift == given string:
         return True
   return False

算法

确定字符串的左移和右移是否会得到给定字符串的暴力法包括尝试字符串的每个可能的移位,并查看是否有任何移位与给定字符串匹配。算法如下:

步骤 1 - 开始时将一个变量初始化为 0,以表示当前移位计数。

步骤 2 - 当移位次数小于字符串长度时:

  • 将字符串左移,即将第一个字符移到字符串的末尾。

  • 验证移位后的字符串是否与给定字符串匹配。如果匹配,则返回真。

  • 对字符串应用右移,即将最后一个字符移到开头。

  • 验证移位后的字符串是否与给定字符串匹配。如果匹配,则返回真。

  • 将移位计数增加 1。

步骤 3 - 如果在尝试所有可能的移位后没有找到匹配项,则返回假。

示例 1

此实现说明函数是 Shifted String 接收两个字符串参数 s 和 target,并返回一个布尔结果,指示 target 是否为 s 的左移或右移。

函数首先确认两个字符串的长度相等,然后确定 target 是否为 s 的移位版本。之后,它通过组合每个可能的移位位置之前和之后的子字符串来构建新字符串。如果所需字符串中的左移或右移字符串类似,则该方法返回 true。如果是这种情况,它返回 false。

在主函数中,我们定义了两个示例字符串 s 和 target,并使用这些字符串来调用 Shifted String 方法。然后,程序指示 target 是否为 s 的移位形式。

#include <iostream>
#include <string>

using namespace std;

bool isShiftedString(string s, string target) {
   if(s.length() != target.length()) {
      return false;
   }
   int n = s.length();
   for(int i = 0; i < n; i++) {
      string leftShift = s.substr(i) + s.substr(0, i); // left shift the string
      string rightShift = s.substr(n-i) + s.substr(0, n-i); // right shift the string
      if(leftShift == target || rightShift == target) {
         return true;
      }
   }
   return false;
}

int main() {
   string s = "abcde";
   string target = "cdeab";
   if(isShiftedString(s, target)) {
      cout << "The string is shifted." << endl;
   } else {
      cout << "The string is not shifted." << endl;
   }
   return 0;
}

输出

The string is shifted.

方法 2:检查子字符串

要确定较短字符串是否是较长字符串的一部分,“检查子字符串”方法可以派上用场。此过程涉及遍历较长字符串,并将与较短字符串长度相同的各个子字符串与较短字符串本身进行比较。如果两个字符串匹配,则确认较短字符串确实是较长文本的子集。为了提高本文的复杂性和不同的句子长度,应将此想法分解成简单但引人入胜的部分。

语法

可以使用以下语法来确定任何字符串的左移和右移是否会得到给定字符串:

if (string_to_check_in.find(substring_to_check) != -1):
   //Substring found in string, so it is a left or right shift
else:
   //Substring not found, so it is not a left or right shift

算法

使用以下算法来确定字符串的左移和右移是否会得到给定字符串:

步骤 1 - 从输入和目标字符串开始。

步骤 2 - 验证输入字符串的长度和目标字符串的长度是否相等。如果不相等,则返回 False。

步骤 3 - 必须将输入字符串与输出字符串合并以构造一个新序列。

步骤 4 - 应该在它们之间进行比较,以确认输入字符串是否包含在新构造的序列中。

步骤 5 - 如果两个字符串完全一致,则答案将是肯定的;否则,答案将是否定的。

示例 2

这是一个 C++ 代码,用于查看任何字符串的左移和右移是否会得到给定字符串:

此示例检查两个数组 s1 和 s2 之间的关系,以查看它们是否共享任何类似的字符串。通过坚持认为 s1 和 s2 的长度必须相同,然后将它们连接为一个名为“s1s1”的数组。进一步检查此数组以确定是否可以找到 s2 的一部分,其中搜索的结果将输出“true”或“false”。此技术用于提供关联的基本反应,还用于进一步评估 s1 和 s2 的左右字段,以确认这两个数组之间的关联。

#include <iostream>
#include <string>

using namespace std;

bool checkForSubstring(string s1, string s2) {
   if (s1.length() != s2.length()) {
      return false;
   }
    
   string s1s1 = s1 + s1;
    
   if (s1s1.find(s2) != string::npos) {
      return true;
   }
    
   return false;
}
int main() {
   string s1 = "abcd";
   string s2 = "cdab";
    
   if (checkForSubstring(s1, s2)) {
      cout << "Yes, left or right shift of string " << s1 << " results in " << s2 << endl;
   } else {
      cout << "No, left or right shift of string " << s1 << " does not result in " << s2 << endl;
   }
   return 0;
}

输出

Yes, left or right shift of string abcd results in cdab

结论

在本主题中,我们得到了一个字符串,并且我们必须确定是否可以通过反复对其应用左移和右移来生成该字符串。

只需将给定字符串与其自身连接起来,并确定新字符串是否保留原始字符串,就可以解决此问题。如果保留,则对字符串本身执行左移和右移将产生原始字符串。

或者,我们可以遍历每个移位位置,并查看是否有任何移位后的字符串与输入字符串匹配。

在两种情况下,解决方案的时间复杂度都是 O(n2),其中 n 是字符串的长度。任何字符串的左移和右移是否会得到给定字符串:

更新于: 2023-07-31

404 次查看

开启您的 职业生涯

通过完成课程获得认证

开始
广告