通过“回文字算法”复习C++语言
一、什么是回文字
给定一个字符串,从前往后读和从后往前读,字符串序列不变。例如,河北省农村信用社的客服电话是“96369”,无论从后往前读,还是从前后往后读,各个字符出现的位置不变。
二、功能实现
(一)、给定一个字符串,判断该字符串是否是回文字。
(二)、给定一个任意字符串,判断是否可以转换为回文字,如果可以转换为回文字,给出具体的算法。
三、C++语言实现版本(JAVA语言版本后续实现)
(一)头文件(BackText.h)
/*
*BackText.h
*
*Createdon:2016年9月30日
*Author:gaodianhua
*/
#include<string>
#include<cstring>
#include<map>
#ifndefBACKTEXT_H_
#defineBACKTEXT_H_
usingnamespacestd;
classBackText{
stringtext;
map<char,int>mapBychar;
intchecksum;
public:
BackText();
BackText(charstr[]);
BackText(stringtext);
virtual~BackText();
boolisBackText();
voidprint()const;
voidcountDiffCh();
voidconvert(char*dest);
};
#endif/*BACKTEXT_H_*/
(二)类的实现
/*
*BackText.cpp
*
*Createdon:2016年9月30日
*Author:gaodianhua
*/
#include"BackText.h"
#include<iostream>
#include<string>
#include<iterator>
#include<cstring>
#include<cstdlib>
#include<map>
usingnamespacestd;
BackText::BackText(){
}
BackText::~BackText(){
this->checksum=0;
}
BackText::BackText(char*str){
this->text=str;
this->checksum=0;
}
BackText::BackText(stringstr){
this->text=str;
this->checksum=0;
}
boolBackText::isBackText(){
string::iteratorit1,it2;
it1=text.begin();
it2=text.end()-1;
for(;it1<=it2;it1++,it2--){
if(*it1!=*it2)
returnfalse;
}
returntrue;
}
voidBackText::print()const{
cout<<this->text<<endl;
}
voidBackText::countDiffCh(){
string::iteratorit1,it2;
stringtemp;
temp.clear();
intindex=0;
for(it1=text.begin();it1<text.end();it1++){
if(strchr(temp.data(),*it1)==NULL){
temp.insert(index,1,*it1);
index++;
}
}
for(it2=temp.begin();it2<temp.end();it2++){
intcount=0;
for(it1=text.begin();it1<text.end();it1++){
if(*it1==*it2){
count++;
checksum++;
}
}
mapBychar.insert(pair<char,int>(*it2,count));
}
map<char,int>::iteratorm;
for(m=mapBychar.begin();m!=mapBychar.end();m++)
cout<<m->first<<""<<m->second<<endl;
}
voidBackText::convert(char*dest){
if(isBackText()){
strcpy(dest,text.data());
return;
}
intcnt=0;
map<char,int>::iteratorm;
for(m=mapBychar.begin();m!=mapBychar.end();m++){
if(m->second%2!=0){
cnt++;
}
}
if(cnt>1){
cout<<"该字符串不能被转化为回文字"<<endl;
return;
}
cout<<"开始转换..."<<endl;
intbegIndex=0;
intendIndex=checksum-1;
booloddflag=0;
charoddchar;
for(m=mapBychar.begin();m!=mapBychar.end();m++){
if(checksum%2==0){
for(inti=0;i<m->second/2;i++){
dest[begIndex++]=m->first;
dest[endIndex--]=m->first;
}
}else{
if(m->second%2==0){
for(inti=0;i<m->second/2;i++){
dest[begIndex++]=m->first;
dest[endIndex--]=m->first;
}
}else{
oddchar=m->first;
oddflag=true;
continue;
}
}
}
if(oddflag){
map<char,int>::iteratorit;
it=mapBychar.find(oddchar);
if(it==mapBychar.end()){
cout<<"donotfind"<<oddchar<<endl;
return;
}
for(inti=0;i<it->second;i++){
dest[begIndex++]=it->first;
}
}
}
(三)main函数
/*
*main.cpp
*
*Createdon:2016年9月30日
*Author:gaodianhua
*/
#include<iostream>
#include"BackText.h"
#include<cstdlib>
#include<string>
usingnamespacestd;
intmain(){
stringtext;
text.clear();
cout<<"请输入字符串:";
cin>>text;
BackTextbt=BackText(text);
bt.print();
if(!bt.isBackText())
cout<<"不是回文字符串"<<endl;
bt.countDiffCh();
chardest[100];
memset(dest,0x0,sizeof(dest));
bt.convert(dest);
cout<<dest<<endl;
return0;
}
以上所述是小编给大家分享的通过“回文字算法”复习C++语言,希望对大家有所帮助!