package com.gdh.backtext;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

public class BackText {
String text;

public BackText() {
  super();
  this.text = null;
}

public BackText(String text) {
  super();
  this.text = text;
}

public boolean isBackText(){
  for(int i=0,j=text.length()-i-1;i<=j;i++,j--){
    if( text.charAt(i) != text.charAt(j) ){
      return false;
    }
  }
  return true;
}

public Map<Character,Integer> countString(){

  Map<Character,Integer> map=new HashMap<>();
  int count=0;

  String temp=new String();
  for(int i=0;i< text.length();i++){
    if ( temp.indexOf(text.charAt(i), 0) < 0){
      temp+=text.charAt(i);
    }
  }
  map.clear();
  for(int i=0;i< temp.length();i++){
    if(!map.containsKey(temp.charAt(i))){
      for(int j=0;j< text.length();j++){
        if(text.charAt(j) == temp.charAt(i) ){
          count++;
        }
      }
      map.put(temp.charAt(i), count);
      count=0;
    }
  }
  //循环打印
  for(Entry<Character,Integer> item:map.entrySet()){
    System.out.println("字符:" + item.getKey() + " 值:" + item.getValue());
  }
  return map;
}

public String convert(){

  int checksum = 0;
  int itemcount=0;

  Map<Character,Integer> map=countString();
  for(Entry<Character,Integer> item:map.entrySet()){
  checksum+=item.getValue();
  if( item.getValue() %2 != 0)
    itemcount++;
  }
  if( itemcount > 1 ){
    System.out.println("该字符串不能转换为回文字");
    return null;
  }

  StringBuffer temp=new StringBuffer(text);//线程安全
  //StringBuilder temp=new StringBuilder();//线程非安全
  int begIdx=0;
  int endIdx=checksum-1;
  Character key=null;
  boolean flag=false;
  for(Entry<Character,Integer> item:map.entrySet()){
  if( checksum % 2 ==0 ){
  for(int i=0;i<item.getValue()/2;i++){
    temp.setCharAt(begIdx++, item.getKey());
    temp.setCharAt(endIdx--, item.getKey());
  }
    }else{
      if(item.getValue()%2==0 ){
        for(int i=0;i<item.getValue()/2;i++){
          temp.setCharAt(begIdx++, item.getKey());
          temp.setCharAt(endIdx--, item.getKey());
        }
      }else{
        key=item.getKey();
        flag=true;
        continue;
      }
    }
  }
  if(flag)
  {
    for(int i=0;i<map.get(key);i++){
      temp.setCharAt(begIdx++, key);
    }
  }
  return temp.toString();
}

  public static void main(String[] args) {
    BackText bt=new BackText("1122334455667788990");
    if( !bt.isBackText() )
      System.out.println("该字符串不是回文字");
    else
      System.out.println("该字符串是回文字");
    String dest=new String();
    System.out.println("开始转换...");
    dest=bt.convert( ) ;
    System.out.print("转换后的结果为:");
    System.out.println(dest);
  }
}

回文字算法(java版本)的更多相关文章

  1. 通过“回文字算法”复习C++语言。

    一.什么是回文字 给定一个字符串,从前往后读和从后往前读,字符串序列不变.例如,河北省农村信用社的客服电话是“96369”,无论从后往前读,还是从前后往后读,各个字符出现的位置不变. 二.功能实现 ( ...

  2. 微博短链接的生成算法(Java版本)

    最近看到微博的短链接真是很火啊,新浪.腾讯.搜狐等微博网站都加入了短链接的功能.之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太长的话,那么发送的字数将大大减少.短链接的主要职责 ...

  3. POJ 3974 最长回文字串(manacher算法)

    题意:给出一个字符串,求出最长回文字串. 思路:一开始我直接上了后缀数组DC3的解法,然后MLE了.看了DISCUSS发现还有一种计算回文字串更加优越的算法,就是manacher算法.就去学习了一下, ...

  4. 最长回文字串——manacher算法

    时间复杂度:O(n) 参考:https://segmentfault.com/a/1190000003914228 1.问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度. 如果一个字 ...

  5. java实现简单回文算法

    算法要求 编写一个程序,判断一个字符串是否为"回文".回文串:字符串字符从前往后与从后往前一致(中心对称). 算法思路 首先将字符串等分左右两块,然后依次对称比较每一对字符是否相同 ...

  6. 归并排序算法 java 实现

    归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...

  7. Atitit 电子商务订单号码算法(java c# php js 微信

    Atitit 电子商务订单号码算法(java c# php js  微信 1.1. Js版本的居然钱三爷里面没有..只好自己实现了. 1.2. 订单号标准化...长度16位 1.3. 订单号的结构 前 ...

  8. 求字符串的最长回文字串 O(n)

    昨天参加了某公司的校园招聘的笔试题,做得惨不忍睹,其中就有这么一道算法设计题:求一个字符串的最长回文字串.我在ACM校队选拔赛上遇到过这道题,当时用的后缀数组AC的,但是模板忘了没写出代码来. 回头我 ...

  9. JGibbLDA:java版本的LDA(Latent Dirichlet Allocation)实现、修改及使用

    转载自:http://blog.csdn.net/memray/article/details/16810763   一.概述 JGibbLDA是一个java版本的LDA(Latent Dirichl ...

随机推荐

  1. Atitit 深入了解UUID含义是通用唯一识别码 (Universally Unique Identifier),

    Atitit 深入了解UUID含义是通用唯一识别码 (Universally Unique Identifier), UUID1 作用1 组成1 全球唯一标识符(GUID)2 UUID 编辑 UUID ...

  2. win环境安装python爬虫框架scrapy

    #官网下载python for windows #https://www.python.org/downloads/ #安装后在“计算机->属性->高级系统设置->环境变量-> ...

  3. silverlight中 Storyboard(动画)的使用,实现球的上下循环移动,左右移动,及旋转功能

    话说,总结应该是个收获的心情,可现在的自己似乎没感觉到哪个喜悦的心情,说明自己做得还不够好,现在还是把一些做好的东西总结下.“总结”是学习,工作中必须的,不能偷这个懒 o(╯□╰)o 实现上下循环移动 ...

  4. mac下网页中文字体优化

    最近某人吐槽某门户网站在mac下chrome字体超丑,然后发现虽然现在mac用户越来越多,但是大家依然无视mac下的字体差异,于是研究了下mac下网页中的中文字体,和大家分享. 看了一遍国内各大门户和 ...

  5. 使用国内镜像加速下载Android SDK

    本文转自:http://blog.kuoruan.com/24.html.感谢原作者. 什么是Android SDK SDK:(software development kit)软件开发工具包.被软件 ...

  6. 【JDK源码分析】String的存储区与不可变性

    // ... literals are interned by the compiler // and thus refer to the same object String s1 = " ...

  7. 第19/24周 锁升级(Lock Escalations)

    大家好,欢迎回到性能调优培训.上2个星期我们已经讨论了SQLServer里的悲观和乐观锁.今天我想谈下SQL Server里对于锁的一个特殊现象:所谓的锁升级(Lock Escalations).在我 ...

  8. IOS从视频中获取截图

    从视频中获取截图: NSString *movpath =[[NSBundle mainBundle] pathForResource:@”iosxcode4″ ofType:@”mov”]; mpv ...

  9. Hive SQL 监控系统 - Hive Falcon

    1.概述 在开发工作当中,提交 Hadoop 任务,任务的运行详情,这是我们所关心的,当业务并不复杂的时候,我们可以使用 Hadoop 提供的命令工具去管理 YARN 中的任务.在编写 Hive SQ ...

  10. 关于EF的 序列化类型为“XXX”的对象时检测到循环引用。

    在用Ef的时候,也许经常会遇到循环引用的错误. 下面提供解决办法.(不是Json.Net,如果是Json.Net可以给导航属性通过增加特性标签来解决该问题) ef大多数问题,可以通过ToList()来 ...