数据结构之回文字符串
来源:互联网 发布:crf算法原理 编辑:程序博客网 时间:2024/05/16 05:43
1.什么是回文字符串?
回文是一种“从前向后读”和“从后向前读”都相同的字符串。
2.判断是否是回文字符串
//判断是否是回文字符串 回文字符串就是从前向后读和从后向前读是一样的 public static boolean isHuiwenString(String str){ boolean isHuiwen = true; for(int i = 0;i < str.length()/2;i++){ //对称比较字符 if(str.charAt(i) != str.charAt(str.length()-i-1)){ isHuiwen = false; } } return isHuiwen; }
3.将非回文字符串变成回文字符串
思想:使用双链表存储最后返回的字符。从字符串的中间开始,对称比较字符,如果两个字符相等,直接将较小下标的字符追加到链表的头部,将较大下标的字符追加到链表的尾部。如果两个字符不相等,在头部先追加较大下标字符,后追加较小下标字符,在尾部先追加较大下标字符,后追加一个较小下标字符。
a.建立单链表结点类。
/** * 双链表结点 * @date 2017-7-1 * @author liufeifei * @description */public class Node { public Object data;//值 public Node next;//下一个结点 public Node prev;//上一个结点 public Node(Object data,Node next,Node prev){ this.data = data; this.next = next; this.prev = prev; } public Node(){ this(null,null,null); }}
b.双链表
/** * @date 2017-7-2 * @author liufeifei * @description 用于回文字符串的双链表 */public class SinglyList { public Node head;//头指针 public SinglyList(Node head){ this.head = head; } public SinglyList(){ this(null); } //将结点插入在prev结点之后 public Node insert(Node prev,Object data){ Node next = prev.next; Node node = new Node(data,next,prev); prev.next = node; if(next != null){ next.prev = node; } return node; } //追加到链表最后 public Node append(Object data){ Node q = null; if(null == head.next){ head.next = new Node(data,null,null); }else{ Node p = this.head; while(p.next != null){ p = p.next; } q = new Node(data,null,p); p.next = q; } return q; } //追加到链表头部 public Node appendBefore(Object data){ Node next = this.head.next; Node p = new Node(data,next,this.head); if(null != next){ next.prev = p; } this.head.next = p; return p; } //输出链表元素 public String toString(){ StringBuffer sb = new StringBuffer(""); Node p = this.head.next; while(null != p){ sb.append(p.data); p = p.next; } return sb.toString(); }}
c.将非回文字符串变成回文字符串
public static String convertToHuiwenString(String str){ //创建单链表,用单链表存放新的回文串 Node head = new Node(null,null,null); SinglyList list = new SinglyList(head); int len = str.length(); int i = len/2 - 1;//从中间开始判断 while(i >= 0){ if(str.charAt(i) != str.charAt(len-i-1)){ if(i < len-i-1){ //将字符添加到链表中 list.appendBefore(str.charAt(len-i-1)); list.append(str.charAt(len-i-1)); list.appendBefore(str.charAt(i)); list.append(str.charAt(i)); }else{ list.appendBefore(str.charAt(i)); list.append(str.charAt(i)); list.appendBefore(str.charAt(len-i-1)); list.append(str.charAt(len-i-1)); } }else{ if(i == len-i-1){ list.append(str.charAt(i)); }else{ list.appendBefore(str.charAt(i)); list.append(str.charAt(len-i-1)); } } i--; } return list.toString(); }
d.测试
@Testpublic void test(){ String str1 = "abccba"; String str2 = "abbdbd"; System.out.println(isHuiwenString(str1)); System.out.println(isHuiwenString(str2)); String result1 = convertToHuiwenString(str2); System.out.println(result1); String result2 = convertToHuiwenString(str1); System.out.println(result2);}
e.运行结果
truefalseadbbddbbdaabccba
阅读全文
0 0
- 数据结构之回文字符串
- 数据结构——回文字符串
- 字符串之回文串
- 庞果网挑战之回文字符串
- 动态规划之回文字符串
- 数据结构——算法之(005)(判断字符串是否是对称的即(回文字符串))
- 数据结构之栈和队列---回文判断
- 数据结构之回文专题(Palindrome)
- 数据结构之 字符串
- redis数据结构之字符串
- 数据结构之字符串
- 数据结构之字符串
- 数据结构之字符串ADT
- 数据结构之字符串
- 数据结构之字符串
- 数据结构之字符串
- 数据结构算法之字符串
- python数据结构之字符串
- 51nod1289 大鱼吃小鱼
- Hibernate5调用Oracle中存储过程
- 最大公约数和最小公倍数
- HDU5943-Kingdom of Obsession
- Codeforces Round #421 (Div. 1):B. Mister B and PR Shifts 思维,乱搞
- 数据结构之回文字符串
- <Paper Reading>Need to solve
- RxJava合并Observable——merge和mergeDelayError操作符
- bugku CTF练习平台writeup
- 实验性的亚马逊返利连接编辑系统
- mysql数据库开启远程连接
- <Need to solve>
- Web前端知识体系精简
- Android 动态设置view的id,id设置为数字