通过“回文字算法”复习C++语言。
一、什么是回文字
给定一个字符串,从前往后读和从后往前读,字符串序列不变。例如,河北省农村信用社的客服电话是“96369”,无论从后往前读,还是从前后往后读,各个字符出现的位置不变。
二、功能实现
(一)、给定一个字符串,判断该字符串是否是回文字。
(二)、给定一个任意字符串,判断是否可以转换为回文字,如果可以转换为回文字,给出具体的算法。
三、C++语言实现版本(JAVA语言版本后续实现)
(一)头文件 (BackText.h)
/*
* 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_ */
(二)类的实现
/*
* 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函数
/*
* 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++语言。的更多相关文章
- 回文字算法(java版本)
package com.gdh.backtext;import java.util.HashMap;import java.util.Map;import java.util.Map.Entry; p ...
- POJ 3974 最长回文字串(manacher算法)
题意:给出一个字符串,求出最长回文字串. 思路:一开始我直接上了后缀数组DC3的解法,然后MLE了.看了DISCUSS发现还有一种计算回文字串更加优越的算法,就是manacher算法.就去学习了一下, ...
- 最长回文字串——manacher算法
时间复杂度:O(n) 参考:https://segmentfault.com/a/1190000003914228 1.问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度. 如果一个字 ...
- 求字符串的最长回文字串 O(n)
昨天参加了某公司的校园招聘的笔试题,做得惨不忍睹,其中就有这么一道算法设计题:求一个字符串的最长回文字串.我在ACM校队选拔赛上遇到过这道题,当时用的后缀数组AC的,但是模板忘了没写出代码来. 回头我 ...
- hihocoder 第一周 最长回文字串
题目1 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程 ...
- 2238"回文字串"报告
题目描述: 回文串,就是从前往后和从后往前看都是一样的字符串.那么现在给你一个字符串,请你找出该字符串中,长度最大的一个回文子串. 输入描述: 有且仅有一个仅包含小写字母的字符串,保证其长度不超过50 ...
- 排序算法总结(C语言版)
排序算法总结(C语言版) 1. 插入排序 1.1 直接插入排序 1.2 Shell排序 2. 交换排序 2.1 冒泡排序 2.2 快速排序 3. 选择 ...
- 魔方阵算法及C语言实现
1 魔方阵概念 填充的,每一行.每一列.对角线之和均相等的方阵,阶数n = 3,4,5….魔方阵也称为幻方阵. 例如三阶魔方阵为: 魔方阵有什么的规律呢? 魔方阵分为奇幻方和偶幻方.而偶幻方又分为是4 ...
- 一个UUID生成算法的C语言实现 --- WIN32版本 .
一个UUID生成算法的C语言实现——WIN32版本 cheungmine 2007-9-16 根据定义,UUID(Universally Unique IDentifier,也称GUID)在时 ...
随机推荐
- JS设置cookie、读取cookie、删除cookie
JS设置cookie.读取cookie.删除cookie JS设置cookie,注意一定要path=/ ,根目录,不然其他目录可能查询不到..默认是本目录. document.cookie ...
- 程序员藏经阁 Linux兵书
程序员藏经阁 Linux兵书 刘丽霞 杨宇 编 ISBN 978-7-121-21992-4 2014年1月出版 定价:79.00元 536页 16开 内容提要 <Linux兵书>由浅 ...
- java初学者应掌握的30个基本概念
核心提示:OOP中唯一关系的是对象的接口是什么,就像计算机的销售商她不管电源内部结构 是怎样的,他只关系能否给你提供电就行了,也就是只要知道can or not而不是how and why. 基本概念 ...
- Mongodb 的基本使用
一.cmd连接mongodb 服务 进入mongodb的bin目录下:[D:\mongodb3.2.5\bin]$ mongo 127.0.0.1:27017 常用查询: show dbs 查看所有数 ...
- sdk更新代理设置
sdk更新代理设置 http://www.cnblogs.com/zhoujg/p/4560998.html
- 锁&锁与指令原子操作的关系 & cas_Queue
锁 锁以及信号量对大部分人来说都是非常熟悉的,特别是常用的mutex.锁有很多种,互斥锁,自旋锁,读写锁,顺序锁,等等,这里就只介绍常见到的, 互斥锁 这个是最常用的,win32:CreateMute ...
- PNG使用技巧 PNG的使用技巧
PNG的格式和透明度 这个Fireworks会比较清楚,打开Fireworkd优化面板,可以清楚看到png有3种不同深度的格式:png8.png24.png32. 其中,在优化面板选择png8,可发现 ...
- Android如何避免切换至SurfaceView时闪屏(黑屏闪一下)以及黑屏移动问题
1.最近的项目中,有一个Activity用到Fragment+ViewPager,其中一个fragment中实现了视频播放的功能,包含有SurfaceView.结果,每次打开程序第一次进入到该Acti ...
- JS实现弹出层对话框
点击按钮后,弹出层对话框,可交互,点击关闭后才关闭掉对话框. 效果图: 源码: <!doctype html> <html> <head> <meta cha ...
- Skeljs – 用于构建响应式网站的前端开发框架
skelJS 是一个轻量级的前端框架,用于构建响应式站点和应用程序.让设计人员和开发人员可能够使用四个强大的组件:CSS 网格系统,响应式处理程序,CSS 的快捷方式和插件系统. 您可能感兴趣的相关文 ...