数据结构之回文字符串

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

你可能感兴趣的:(数据结构与算法,数据结构,回文字符串)