1. 程式人生 > 其它 >【例題2】移位包含

【例題2】移位包含

【例題2】移位包含
題面

題目描述

對於一個字串來說,定義一次迴圈移位操作為:將字串的第一個字元移動到末尾形成新的字串。

給定兩個字串 \(s1\)\(s2\),要求判定其中一個字串是否是另一字串通過若干次迴圈移位後的新字串的子串。例如 CDAA 是由 AABCD 兩次移位後產生的新串 BCDAA 的子串,而 ABCDACBD 則不能通過多次移位使得其中一個字串是新串的子串。

輸入格式

一行,包含兩個字串,中間由單個空格隔開。字串只包含字母和數字。

輸出格式

如果一個字串是另一字串通過若干次迴圈移位產生的新串的子串,則輸出 true,否則輸出 false

樣例

樣例輸入

AABCD CDAA

樣例輸出

true

資料範圍與提示

對於 \(100\%\) 的資料,\(1\le length(s1),length(s2)\le 30\)

分析

  • 注意到題面所說的

對於一個字串來說,定義一次迴圈移位操作為:將字串的第一個字元移動到末尾形成新的字串。

  • 這意味著什麼,一個字元從字串的頭移到尾?
  • 這不就是說如果字串 \(s2\) 在字串 \(s1+s1\) 中就說明成立嗎?
  • 為什麼?
  • 因為將一個字元從字串的頭移到尾的話,將 \(s1\)\(length(s1)\) 個字元進行移位操作,那麼得到的新字串還是 \(s1\)
  • 那麼也就是意味著 \(s1\)
    \(s1+s1\) 中長度為 \(length(s1)\) 的字串。
  • 因此,我們只需要判斷 \(s2\) 是否是 \(s1+s1\) 的子串。

字串的find()函式可以查詢另一個字串是否為該字串的子串,

若是,返回另一個字串的第一個字元在該字串中的位置

若不是,返回該字串的npos(一個極大的數)

Code
#include <bits/stdc++.h>
using namespace std;

string s1, s2;

int main(void) {
    cin >> s1 >> s2;
    s1 += s1;
    if (s1.find(s2) != s1.npos)
        puts("true");
    else
        puts("false");

    return 0;
}

部落格園:https://www.cnblogs.com/Juro/

Copyright ©2021 Juro

【轉載文章務必保留出處和署名,謝謝!】