Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

두 개의 문자열을 분할하여 회문으로 만드는 프로그램을 C++로 작성하십시오.

<시간/>

문자열을 뒤집은 후에도 그대로 유지되는 경우 문자열을 회문 문자열이라고 합니다.

이 특정 문제에서 우리는 길이가 같은 두 개의 문자열 'a'와 'b'를 제공했습니다. 일부 인덱스로 분할된 경우 작업은 문자열의 합이 회문을 만드는지 여부를 확인하는 것입니다.

길이가 '4'인 두 개의 문자열 'a'와 'b'가 있고 인덱스 '3'에서 두 문자열을 다음과 같이 분할한 후,

아아아 | ㄴbb |

aaa(첫 번째 문자열의 접두사) + a(두 번째 문자열의 접미사)는 회문이어야 합니다.

또는

b(첫 번째 문자열의 접미사) + bbb(두 번째 문자열의 접두사)는 회문이어야 합니다.

예를 들어

입력-1:

a = “abcdef”

b = “fedcba”

출력:

True

설명: 인덱스 '2'에서 문자열 'a'와 문자열 'b'를 분할하면 다음과 같이 됩니다.

ABC | def와 먹이 | cba

abc(첫 번째 문자열의 접두사) + cba(두 번째 문자열의 접미사)는 회문 문자열을 만듭니다. 따라서 "True"를 반환합니다.

입력-2:

a =  “eatable”

b =  “tableau”

출력:

False

설명: 이 두 문자열을 회문으로 만드는 방법은 없습니다.

이 문제를 해결하기 위한 접근 방식

이 특정 문제를 해결하기 위해 두 포인터 접근 방식을 사용합니다. 이 접근 방식에서는 먼저 낮은 값이 '0'을 가리키고 높은 값이 문자열의 마지막 문자를 가리키도록 두 개의 포인터(낮음 및 높음)를 초기화합니다.

두 문자열의 길이가 같으므로 2자 미만인 문자열이 있는지 확인합니다. 그렇다면 True를 반환합니다. 그렇지 않으면 포인터를 사용하여 전체 문자열을 반복하여 재귀적으로 검사합니다. 두 문자열이 같으면 True, 그렇지 않으면 False를 반환합니다.

  • 각각 'a'와 'b'라는 두 개의 문자열을 사용합니다.
  • 부울 함수 checkPalindromic(string a, string b)는 두 개의 문자열을 입력 매개변수로 사용하고 그에 따라 True 또는 False를 반환합니다.
  • 낮음 =0 및 높음 =문자열 'b'의 길이로 두 개의 포인터(낮음 및 높음)를 초기화합니다.
  • 문자열을 반복하고 두 문자열의 문자가 같은지 확인합니다.
  • 부울 함수 split(string a, string b)는 두 개의 문자열을 가져와 회문이면 True를 반환하고 그렇지 않으면 False를 반환합니다.

#include <bits/stdc++.h>
using namespace std;
bool isPalindrome(string a, int low, int high) {
   while (low < high) {
      if (a[low] != a[high])
         return false;
      low++;
      high--;
   }
   return true;
}
bool Split(string a, string b) {
   int low = 0;
   int high = b.size() - 1;
   while (low < high and a[low] == b[high]) {
      low++;
      high--;
   }
   return isPalindrome(a, low, high) || isPalindrome(b, low, high);
}
bool checkPalindromic(string a, string b) {
   if (a.size() < 2)
      return true;
   return Split(a, b) || Split(b, a);
}
int main() {
   string a = "abcpqr";
   string b = "mnocba";
   if (checkPalindromic(a, b)) {
      cout << "True" << endl;
   } else {
      cout << "False" << endl;
   }
   return 0;
}

위의 코드를 실행하면 다음과 같이 출력이 생성됩니다.

출력

True

설명: 인덱스 '2'에서 주어진 문자열 'abcpqr'과 'mnocba'를 다음과 같이 분할하면

a(접두사) =abc b(접미사) =cba

a(접미사) =pqr b(접두사) =mno

a(접두사) + b(접미사)가 회문을 만들어 출력이 True인 것을 관찰할 수 있습니다.