仅交换一个字符即可构成回文


在C++环境中,回文是指在进程的初始阶段到该特定进程终止的过程中,集合或字符串保持不变的过程。假设我们有一个字符串,表示为str[]。任务是检查在仅执行一次字符交换后,字符串是否为回文。

这是一个交换过程的通用示例:

Input : ARBRDD
Output : true
Explanation: Swap the value A(1st index present in the list) with the R.
Input : INDBAN
Output : true
Explanation: Swap the vlaue of I(0th element present in the index set) with
N(last value of the index here) or
Swap I(1st value present in the index list) with N(the second
value present in the index list)
Input : gcagac
Output : the value is totally false

仅交换一个字符即可找到回文的算法

在这个可能的算法中,我们将通过在C++环境中仅交换一个字符来执行回文的打印过程。通过此算法,我们将构建一些C++语法,以有效的方式学习问题陈述。

  • 步骤1 - 开始进程。

  • 步骤2 - 声明输入输出流。

  • 步骤3 - 导入内置类和声明的函数。

  • 步骤4 - 声明输入长度。

  • 步骤5 - 防止字符串成为回文。

  • 步骤6 - 计算差值。

  • 步骤7 - 记录那些阻止进程的字符。

  • 步骤8 - 循环到中点。

  • 步骤9 - 记录和存储不同的字符。

  • 步骤10 - 打开开关。

  • 步骤11 - 如果找到回文值,则返回true。

  • 步骤12 - 否则返回false作为表示。

  • 步骤13 - 查找中间字符的差异。

  • 步骤14 - 声明驱动程序代码并获取返回值。

  • 步骤15 - 终止进程。

仅交换一个字符即可找到回文的语法

String input = "INPUT STRING";
char[] arr = input.toCharArray();
int swap = 0;
int i = 0;
int j = arr.length-1;
char temp;
while(i<j){
if(arr[i] != arr[j]){
   if(arr[i+1] == arr[j]){
		temp = arr[i];
		arr[i] = arr[i+1];
		arr[i+1] = temp;
		i++;j--;
		swap++;
   } else if(arr[i] == arr[j-1]){
		temp = arr[j];
		arr[j] = arr[j-1];
		arr[j-1] = temp;
		i++;j--;
		swap++;
	} else if(arr[i+1] == arr[j-1] && i+1 != j-1){
		temp = arr[j];
		arr[j] = arr[j-1];
		arr[j-1] = temp;
		temp = arr[i];
		arr[i] = arr[i+1];
		arr[i+1] = temp;
		i++;j--;
		swap = swap+2;
	} else {
		swap = -1;break;
	}
}
else{
   i++;j--;
}

在这个可能的语法中,我们已经通过在C++环境中仅交换一个字符来执行回文的打印过程。通过这些可能的语法,我们将构建一些C++语法,以更广泛的方式学习问题陈述。

遵循的方法

  • 方法1 - 使用bool isPalindromePossible()、str.length()和双指针方法提取仅交换一个字符的回文值的C++程序

  • 方法2 - 使用词典值和迭代方法提取仅交换一个字符的回文值的C++程序

方法1:使用Bool IsPalindromePossible()、Str.length()和双指针方法

Bool IsPalindromePossible()方法的使用

在这种可能的方法中,我们将应用布尔isPalindromePossible()方法,通过从特定字符串中交换一个字符来打印回文值。

bool check(string s){
	int n=s.length();
	map<char,int> m;
	for(auto i:s){
		m[i]++;
	}
	int cnt=0;
	for(auto i=m.begin();i!=m.end();i++)
	128{
		if(i->second%2){
			cnt++;
		}
	}
	if(n%2&&cnt==1){return true;}
	if(!(n%2)&&cnt==0){return true;}
	return false;
}

示例

//C++ program palindrome by swapping only one character with the bool isPalindromePossible() method
#include <bits/stdc++.h>
using namespace std;
bool isPalindromePossible(string input){
   int len = input.length();
   int diffCount = 0, i;
   char diff[2][2];
   for (i = 0; i < len / 2; i++){
      if (input[i] != input[len - i - 1]){
         if (diffCount == 2) return false;
         diff[diffCount][0] = input[i];
         diff[diffCount++][1] = input[len - i - 1];
      }
   }
   switch (diffCount){
      case 0:
      return true;
      case 1:{
         char midChar = input[i];
         if (len % 2 != 0 and
         (diff[0][0] == midChar or
         diff[0][1] == midChar))
         return true;
      }
      case 2:
      if ((diff[0][0] == diff[1][0] and
      diff[0][1] == diff[1][1]) or
      (diff[0][0] == diff[1][1] and
      diff[0][1] == diff[1][0]))
      return true;
   }
   return false;
}
int main(){
   cout << boolalpha
   << isPalindromePossible("RDD") << endl;
   cout << boolalpha
   << isPalindromePossible("ARBRDD") << endl;
   cout << boolalpha
   << isPalindromePossible("INDBDKOLDHAKA") << endl;
   return 0;
}

输出

true
false
false

Str.length()方法的使用

在这种可能的方法中,我们将应用str.length()方法,通过从特定字符串中交换一个字符来打印回文值。

示例

//C++ program palindrome by swapping only one character with the possible method to convert the string into palindrome string by changing only one character
#include<bits/stdc++.h>
using namespace std;
bool checkPalindrome(string str){
   int n = str.length();
   int count = 0;
   for (int i = 0; i < n/2; ++i)
   if (str[i] != str[n - i - 1])
   ++count;
   return (count <= 1);
}
int main(){
   string str = "ARBRDDINDDBDKOLKATADHAKA";
   if (checkPalindrome(str))
   cout << "Yes - The Process Done " << endl;
   else
   cout << "No - The Process Is Not Done" << endl;
   return 0;
}

输出

No - The Process Is Not Done

双指针方法的使用

在这种可能的方法中,我们将应用使用两个指针的方法,通过从特定字符串中交换一个字符来打印回文值。

示例

//C++ program palindrome by swapping only one character with the possible method by using two pointer approach
#include <bits/stdc++.h>
using namespace std;
int countSwap(string s){
   int n = s.length();
   int count = 0;
   for (int i = 0; i < n / 2; i++){
      int left = i;
      int right = n - left - 1;
      while (left < right){
         if (s[left] == s[right]){
            break;
         } else{
            right--;
         }
      }
      if (left == right){
         return -1;
      }
      for (int j = right; j < n - left - 1; j++){
         swap(s[j], s[j + 1]);
         count++;
      }
   }
   return count;
}
int main(){
   string s = "ARBRDDKOLDHKAINDBD";
   int ans1 = countSwap(s);
   reverse(s.begin(), s.end());
   int ans2 = countSwap(s);
   cout << max(ans1, ans2);
   return 0;
}

输出

-1

方法2:使用词典值和迭代方法

词典方法的使用

词典比较是一个比较函数,它接受两个参数进行处理。在这种可能的方法中,我们将应用词典方法,通过从特定字符串中交换一个字符来打印回文值。

int main(){
string a;
while(cin>>a){
if(a[0]=='0'){
	break;
}
string s;s=a;
int n=s.length();
int cnt=0;
bool ini=false;
if(n%2){ini=true;}
if(check(s)){
	for(int i=0;i<n/2;i++){
		bool fl=false;
		int j=0;
			for(j=n-1-i;j>i;j--){
			if(s[j]==s[i]){
				fl=true;
				for(int k=j;k<n-1-i;k++){
					swap(s[k],s[k+1]);
					cnt++;
					cout<<cnt<<endl<<flush;
				}
				cout<<" "<<i<<" "<<cnt<<endl<<flush;
				break;
			}
		}
		if(!fl&&ini){
			for(int k=i;k<n/2;k++){
				swap(s[k],s[k+1]);
				cnt++;
			}
			cout<<cnt<<" "<<i<<" "<<endl<<flush;
		}
	}
	cout<<cnt<<endl;
}
else{
cout<<"OUTPUT NOTATION PROCESS"<<endl;

示例

//C++ program check whether is it possible to make string A lexicographically smaller than string B to perform the palindrome swaping with one character
#include <bits/stdc++.h>
using namespace std;
void swap(char& x, char& y){
   char temp = x;
   x = y;
   y = temp;
}
bool IsLexicographicallySmaller(
string A, string B){
   if (A < B){
      return true;
   }
   string temp = A;
   sort(temp.begin(), temp.end());
   int index = -1;
   for (int i = 0; i < A.length(); i++){
      if (A[i] != temp[i]) {
         index = i;
         break;
      }
   }
   if (index == -1){
      return false;
   }
   int j;
   for (int i = 0; i < A.length(); i++){
      if (A[i] == temp[index])
      j = i;
   }
   swap(A[index], A[j]);
   if (A < B){
      return true;
   } else {
      return false;
   }
}
int main(){
   string A = "ABONI DAS";
   string B = "RUDRA BISWAS";
   if (IsLexicographicallySmaller(A, B)) {
      cout << "Yes"
      << "\n";
   } else {
      cout << "No"
      << "\n";
   }
   return 0;
}

输出

Yes

迭代方法的使用

在这种可能的方法中,我们将应用迭代方法来打印通过从特定字符串循环中(0, N/2)范围内交换一个字符而获得的回文值。在这里,我们将移除或忽略字符c后,执行一个字符的回文交换。

示例

//C++ program to perform the palindrome swaping with one character after removal or neglecting character c and iterate a loop in the range of (0, N/2)
#include <bits/stdc++.h>
using namespace std;
bool check_palindrome(string str, char c){
   int n = str.length(), i = 0, j = n - 1;
   while (i < j) {
      if (str[i] == c)
      i++;
      else if (str[j] == c)
      j--;
      else if (str[i] != str[j])
      return 0;
      else
      i++, j--;
   }
   return 1;
}
string make_palindrome(string str){
   bool is_palindrome = 1;
   int n = str.length();
   if (n == 1 || n == 2) {
      return "YES";
   }
   for (int i = 0; i < n / 2; ++i) {
      if (str[i] != str[n - 1 - i]) {
         is_palindrome
         = check_palindrome(str, str[i])
         || check_palindrome(
         str, str[n - 1 - i]);
         break;
      }
   }
   if (is_palindrome)
   return "Yes";
   else
   return "No";
}
int main(){
   string S = "ARBRDDKOLKATADHAKAINDBANGLADESH";
   string res = make_palindrome(S);
   cout << (res);
   return 0;
}

输出

No

结论

在今天的文章中,我们学习了如何在C++环境中实现构建和应用各种方法来打印通过仅交换一个字符设置的回文值集的过程。通过上述逻辑、语法和算法;我们尝试构建一些C++代码来有效地解决问题陈述。

更新于:2023年12月27日

127 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告