1. 程式人生 > >資料結構之迴文字串

資料結構之迴文字串

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