通过“回文字算法”复习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)在时 ...
随机推荐
- Android笔记——Android五大布局
一.五大布局 Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是Li ...
- MongoDB修改器的使用2
1."$inc"的使用 主要用来增加数值,比如网站的访问量,点击量,流量等 db.games.insert({game:"pinball",user:" ...
- Visual-Studio-2015-Cheat-Sheet Visual Studio 2015 快捷键列表
PDF 文件下载 http://files.cnblogs.com/files/JamesLi2015/Visual-Studio-2015-Cheat-Sheet.pdf
- (转)清理AIX的/var文件系统大小
在ROOTVG空间有限,且/var文件系统的空间已经足够大的情况下,/var文件系统空间快满了,这种情况怎么处理?IBM给了一个很好的处理流程: 使用find 命令检查在/var目录中所有大于1MB的 ...
- 面试准备 - C# 版本的树状数组
树状数组 计算 任意连续N个值的和的时间复杂度为Log(n) 修改也是Log(n) 而普通数组修改是O(1) 计算和是O(n) 具体定义可以看这里:http://zh.wikipedia.org/zh ...
- 在IIS中部署ASP.NET 5应用程序遭遇的问题
用VS2015中创建了一个非常简单的ASP.NET5程序: 在Startup.cs中只输入一行代码: using System; using Microsoft.AspNet.Builder; usi ...
- 编译Linux内核
下面的实验以 debian7.5 64bit 为例. 获取源码 获取 debian7.5 本身的源码非常简单: sudo apt-get install linux-source https://ww ...
- JAVA 设计模式 访问者模式
用途 访问者模式 (Visitor) 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式是一种行为型模式. 用途
- 深度浅出immutable.js
这篇文章将讲述immutable.js的基本语法和用法. 1.fromJs() Deeply converts plain JS objects and arrays to Immutable Ma ...
- ios基础之 view的frame 与 bounds 的区别 (转)
前言: 学习ios开发有一段时间了,项目也做了两个了,今天看视频,突然发现view的frame和bound两个属性,发现bound怎么也想不明白,好像饶你了死胡同里,经过一番尝试和思考,终于弄明白bo ...