ホームページ >バックエンド開発 >C++ >任意の文字列を左右にシフトすると、指定された文字列が得られるかどうかを確認します。

任意の文字列を左右にシフトすると、指定された文字列が得られるかどうかを確認します。

WBOY
WBOY転載
2023-09-17 11:29:021278ブラウズ

任意の文字列を左右にシフトすると、指定された文字列が得られるかどうかを確認します。

文字のコレクションは、文字列データ型で表されます。論理的な配置には文字、数字、記号、スペースが使用されます。ほとんどのコンピューター言語では、他のデータ型と区別するために文字列を一重引用符または二重引用符で囲みます。

プログラマは、入出力操作の実行、テキスト データの保存と操作などに文字列を使用することがよくあります。文字列に対する一般的な操作には、連結 (2 つ以上の文字列の結合)、部分文字列の抽出 (文字列の一部の取得)、文字列内の特定の文字またはパターンの検索などがあります。

###方法###

次のメソッドを使用して、文字列の左シフト結果と右シフト結果が各文字列のものであるかどうかを判断できます。 -

方法 1. ブルート フォース クラッキング方法 −

方法 2. 部分文字列 −

を確認する

方法 1: ブルート フォース クラッキング方法

ブルート フォース手法を使用して、入力文字列のすべての左シフトと右シフトを生成し、各文字列をターゲット文字列と比較します。このメソッドの時間計算量 (n は文字列の長さ) は O(n2) です。

###文法###

元の文字列の可能なすべての左シフトと右シフトを反復処理し、指定された文字列と比較します。これは、文字列の左シフトと右シフトが指定された文字列になるかどうかを判断するためです。この戦略の一般的な構文は次のとおりです。 -

リーリー ###アルゴリズム###

文字列の左シフトまたは右シフトの結果が特定の文字列になるかを判断する総当り的な方法は、文字列のすべての可能なシフトをテストし、1 つのシフトが特定の文字列に適合するかどうかを判断することです。アルゴリズムは次のとおりです-

ステップ1

*-最初に変数を0に初期化し、現在のシフトカウントを示します。

ステップ 2

- シフト数が文字列の長さより小さい場合 -

文字列を左にシフトし、最初の文字を文字列の末尾に移動します。

    シフトされた文字列が指定された文字列と一致することを確認します。一致するものがあれば、真の答えが得られます。
  • 最後の文字を先頭に移動して、文字列を右にシフトします。
  • シフトされた文字列が指定された文字列と一致することを確認します。一致するものがあれば、本当の答えを入力してください。
  • シフト数を 1 増やします。
  • ステップ 3

    - 可能なすべてのシフトを試した後、一致するものが見つからない場合は、false を返します。

  • 例 1
の中国語訳は次のとおりです:

例 1 この実装記述関数 Shifted String は、2 つの文字列パラメータ s と target を受け取り、target が s の左シフトか右シフトかを示すブール値の結果を返します。

ターゲットが s のシフトされたバージョンであるかどうかを判断する前に、関数はまず 2 つの文字列の長さが等しいかどうかを確認します。その後、考えられる各シフト位置の前後の部分文字列を組み合わせて、新しい文字列を構築します。このメソッドは、左または右にシフトされた文字列が目的の文字列内で類似している場合に true を返します。そうでない場合は false を返します。

main 関数では、2 つのサンプル文字列 s と target を定義し、これらの文字列を使用して Shifted String メソッドを呼び出します。次にプログラムは、target が s のシフトされた形式であるかどうかを示します。

リーリー ###出力### リーリー

方法 2: 部分文字列を確認する

短い文字列が長い文字列の一部であるかどうかを判断するには、「部分文字列のチェック」メソッドを使用できます。このプロセスには、長い文字列を反復しながら、小さい文字列と同じ長さの個々の部分文字列を小さい文字列自体と比較することが含まれます。 2 つの文字列が一致する場合、短い文字列が確かに大きいテキストのサブセットであることが確認されます。エッセイに複雑さと文の長さの変化を加えるには、アイデアをシンプルでありながら魅力的な部分に分割する必要があります。

###文法###

次の構文を使用して、文字列の左シフトと右シフトの結果が指定された文字列になるかどうかを判断できます -

リーリー ###アルゴリズム###

次のアルゴリズムは、文字列の左シフトと右シフトによって指定された文字列が生成されるかどうかを判断するために使用されます。 -

ステップ 1

- 入力文字列とターゲット文字列の入力を開始します。

ステップ 2

- 入力文字列の長さとターゲット文字列の長さが等しいことを確認します。等しくない場合は False が返されます。

ステップ3

-新しいシーケンスを構築するには、入力文字列を出力文字列とマージする必要があります。

ステップ 4 - 入力文字列が新しく構築されたシーケンスに含まれるかどうかを確認するために比較が必要です。

ステップ 5 - 2 つの文字列がまったく同じである場合、答えは疑問の余地がありませんが、そうでない場合、答えは「いいえ」になります。

例 2 の中国語訳は次のとおりです: 例 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是字符串的长度。ft和任何字符串的右移都会导致给定的字符串−

以上が任意の文字列を左右にシフトすると、指定された文字列が得られるかどうかを確認します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。