> 백엔드 개발 > C++ > 문자열을 왼쪽 및 오른쪽으로 이동하면 해당 문자열이 나오는지 확인합니다.

문자열을 왼쪽 및 오른쪽으로 이동하면 해당 문자열이 나오는지 확인합니다.

WBOY
풀어 주다: 2023-09-17 11:29:02
앞으로
1239명이 탐색했습니다.

문자열을 왼쪽 및 오른쪽으로 이동하면 해당 문자열이 나오는지 확인합니다.

문자 모음은 문자열 데이터 유형으로 표현됩니다. 논리적인 배열을 위해 문자, 숫자, 기호, 공백을 사용합니다. 대부분의 컴퓨터 언어는 문자열을 다른 데이터 유형과 구별하기 위해 작은따옴표나 큰따옴표를 사용합니다.

프로그래머는 종종 문자열을 사용하여 일부 입력 및 출력 작업을 수행하고 텍스트 데이터를 저장 및 조작합니다. 문자열에 대한 몇 가지 일반적인 작업에는 연결(두 개 이상의 문자열 병합), 하위 문자열 추출(문자열의 일부 가져오기), 문자열에서 특정 문자나 패턴 검색이 포함됩니다.

방법

다음 방법을 사용하여 문자열의 왼쪽 및 오른쪽 이동 결과가 각 문자열에 대해 −

인지 확인할 수 있습니다.

방법 1. 무차별 크래킹 방법 −

방법 2. 하위 문자열 확인 −

방법 1: 무차별 크래킹 방법

무차별 방식을 사용하여 입력 문자열의 왼쪽 및 오른쪽 시프트를 모두 생성하고 각 문자열을 대상 문자열과 비교합니다. n이 문자열의 길이일 때 이 방법의 시간 복잡도는 O(n2)입니다.

문법

원래 문자열의 가능한 모든 왼쪽 및 오른쪽 시프트를 반복하고 이를 주어진 문자열과 비교합니다. 이는 문자열의 왼쪽 및 오른쪽 시프트가 주어진 문자열을 초래하는지 확인하는 무차별 대입 방식입니다. 이 전략의 일반적인 구문은 다음과 같습니다 −

으아아아

알고리즘

문자열의 왼쪽 또는 오른쪽 시프트로 인해 주어진 문자열이 발생하는지 확인하는 무차별 대입 방법은 문자열의 가능한 모든 시프트를 테스트하고 하나의 시프트가 주어진 문자열에 맞는지 확인하는 것입니다. 알고리즘은 다음과 같습니다 −

1단계 − 현재 교대 횟수를 나타내는 변수를 0으로 초기화하여 시작합니다.

2단계 - 교대번호가 문자열 길이보다 작은 경우 -

  • 문자열을 왼쪽으로 이동하여 첫 번째 문자를 문자열 끝으로 이동합니다.

  • 이동된 문자열이 제공된 문자열과 일치하는지 확인하세요. 일치하는 항목이 있으면 실제 답변이 제공됩니다.

  • 마지막 문자를 처음으로 이동하여 문자열을 오른쪽으로 이동합니다.

  • 이동된 문자열이 제공된 문자열과 일치하는지 확인하세요. 일치하는 것이 있으면 정답을 입력하세요.

  • 교대 횟수를 1씩 늘립니다.

3단계 - 가능한 모든 교대 근무를 시도한 후 일치하는 항목이 없으면 false를 반환합니다.

예제 1

의 중국어 번역은 다음과 같습니다.

예제 1

이 구현은 Shifted String 함수가 두 개의 문자열 매개변수 s와 target을 받고, target이 s의 왼쪽 또는 오른쪽 시프트인지 나타내는 부울 결과를 반환한다는 것을 보여줍니다.

대상이 s의 이동된 버전인지 확인하기 전에 함수는 먼저 두 문자열의 길이가 같은지 확인합니다. 그런 다음 가능한 각 이동 위치 전후의 하위 문자열을 결합하여 새 문자열을 만듭니다. 이 메서드는 왼쪽 또는 오른쪽으로 이동한 문자열이 원하는 문자열에서 유사한 경우 true를 반환합니다. 그렇지 않은 경우 false를 반환합니다.

main 함수에서는 두 개의 예제 문자열 s와 target을 정의하고 이 문자열을 사용하여 Shifted String 메서드를 호출합니다. 그런 다음 프로그램은 target이 s의 이동된 형태인지 여부를 나타냅니다.

으아아아

출력

으아아아

방법 2: 하위 문자열 확인

더 작은 문자열이 긴 문자열의 일부인지 확인하려면 "하위 문자열 확인" 방법을 사용할 수 있습니다. 이 프로세스에는 더 긴 문자열을 반복하면서 더 작은 문자열과 동일한 길이의 개별 하위 문자열을 더 작은 문자열 자체와 비교하는 작업이 포함됩니다. 두 문자열이 일치하면 더 짧은 문자열이 실제로 더 큰 텍스트의 하위 집합임을 확인합니다. 에세이에 문장 길이에 복잡성과 다양성을 추가하려면 아이디어를 단순하면서도 매력적인 부분으로 나누어야 합니다.

문법

다음 구문을 사용하여 문자열의 왼쪽 및 오른쪽 시프트가 제공된 문자열이 되는지 여부를 확인할 수 있습니다. -

으아아아

알고리즘

다음 알고리즘은 문자열의 왼쪽 및 오른쪽 시프트가 제공된 문자열을 생성하는지 여부를 결정하는 데 사용됩니다. −

1단계 - 입력 문자열과 대상 문자열 입력을 시작합니다.

2단계 - 입력 문자열의 길이와 대상 문자열의 길이가 동일한지 확인합니다. 같지 않으면 False가 반환됩니다.

3단계 − 새 시퀀스를 만들려면 입력 문자열을 출력 문자열과 병합해야 합니다.

4단계 - 입력 문자열이 새로 구성된 시퀀스에 포함되어 있는지 확인하기 위해 비교가 필요합니다.

5단계 - 두 문자열이 정확히 동일하면 대답은 의심할 여지가 없습니다. 그렇지 않으면 대답은 '아니오'입니다.

예 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:tutorialspoint.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿