一、什么是回文字
给定一个字符串,从前往后读和从后往前读,字符串序列不变。例如,河北省农村信用社的客服电话是“96369”,无论从后往前读,还是从前后往后读,各个字符出现的位置不变。
二、功能实现
(一)、给定一个字符串,判断该字符串是否是回文字。
(二)、给定一个任意字符串,判断是否可以转换为回文字,如果可以转换为回文字,给出具体的算法。
三、C++语言实现版本(JAVA语言版本后续实现)
(一)头文件 (BackText.h)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/*
* BackText.h
*
* Created on: 2016年9月30日
* Author: gaodianhua
*/
#include <string>
#include <cstring>
#include <map>
#ifndef BACKTEXT_H_
#define BACKTEXT_H_
using namespace std;
class BackText {
string text;
map< char , int > mapBychar;
int checksum;
public :
BackText();
BackText( char str[]);
BackText(string text);
virtual ~BackText();
bool isBackText();
void print() const ;
void countDiffCh();
void convert( char * dest);
};
#endif /* BACKTEXT_H_ */
|
(二)类的实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
/*
* BackText.cpp
*
* Created on: 2016年9月30日
* Author: gaodianhua
*/
#include "BackText.h"
#include <iostream>
#include <string>
#include <iterator>
#include <cstring>
#include <cstdlib>
#include <map>
using namespace std;
BackText::BackText() {
}
BackText::~BackText() {
this ->checksum=0;
}
BackText::BackText( char *str){
this ->text=str;
this ->checksum=0;
}
BackText::BackText(string str){
this ->text=str;
this ->checksum=0;
}
bool BackText::isBackText(){
string::iterator it1,it2;
it1=text.begin();
it2=text.end()-1;
for (;it1<=it2;it1++,it2--){
if (*it1!=*it2)
return false ;
}
return true ;
}
void BackText::print() const {
cout<< this ->text<<endl;
}
void BackText::countDiffCh(){
string::iterator it1,it2;
string temp;
temp.clear();
int index=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++){
int count=0;
for (it1=text.begin();it1<text.end();it1++){
if (*it1==*it2){
count++;
checksum++;
}
}
mapBychar.insert(pair< char , int >(*it2,count));
}
map< char , int >::iterator m;
for (m=mapBychar.begin( );m != mapBychar.end( ); m++ )
cout <<m->first<< " " <<m->second<<endl;
}
void BackText::convert( char * dest){
if (isBackText()){
strcpy (dest,text.data());
return ;
}
int cnt=0;
map< char , int >::iterator m;
for (m=mapBychar.begin( );m != mapBychar.end( ); m++ ){
if (m->second%2!=0){
cnt++;
}
}
if (cnt>1){
cout<< "该字符串不能被转化为回文字" <<endl;
return ;
}
cout<< "开始转换..." <<endl;
int begIndex=0;
int endIndex=checksum-1;
bool oddflag=0;
char oddchar;
for (m=mapBychar.begin( );m != mapBychar.end( ); m++ ){
if ( checksum % 2 == 0 ){
for ( int i=0; i< m->second/2; i++ ){
dest[begIndex++]=m->first;
dest[endIndex--]=m->first;
}
} else {
if (m->second % 2 == 0){
for ( int i=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 >::iterator it;
it=mapBychar.find(oddchar);
if (it==mapBychar.end()){
cout<< "do not find " << oddchar <<endl;
return ;
}
for ( int i=0; i< it->second; i++ ){
dest[begIndex++]=it->first;
}
}
}
|
(三)main函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/*
* main.cpp
*
* Created on: 2016年9月30日
* Author: gaodianhua
*/
#include <iostream>
#include "BackText.h"
#include <cstdlib>
#include <string>
using namespace std;
int main(){
string text;
text.clear();
cout<< "请输入字符串:" ;
cin>>text;
BackText bt=BackText(text);
bt.print();
if ( !bt.isBackText() )
cout<< "不是回文字符串" <<endl;
bt.countDiffCh();
char dest[100];
memset (dest,0x0, sizeof (dest));
bt.convert(dest);
cout<<dest<<endl;
return 0;
}
|
以上所述是小编给大家分享的通过“回文字算法”复习C++语言,希望对大家有所帮助!
原文链接:http://www.cnblogs.com/gaodianhua/p/5924983.html