資料結構之迴文字串
阿新 • • 發佈:2019-01-29
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.測試
@Test
public 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.執行結果
true
false
adbbddbbda
abccba