java 字符串问题

1.判断两个字符串包含的字符是不是一样,顺序无关。例如,abcd和dcba就相同,但是abcd和abce是不相同的。
解决思路:如果两个字符串的length不一样,直接返回false;接着把两个字符串转为字符数组,并做快排。排序后就简单了,遍历两个数组,只要下标一样,字符不一样就立即返回false,
代码:

package basic.orderBy;

import java.util.Scanner;

/**
 * author tanbin
 * 判断两个字符串里面的字符的是不是一样,不管顺序。只要字符的种类一样,同样字符的数量一样。
 * Created by Administrator on 2016/12/6.
 */
public class EssenseString {
    public static void quicksort(char[] a,int x,int y){
        if(x>=y){
            return;
        }
        int mid = a[x];
        int i = x;
        int j = y;
        while(i<j){
            while(i!=j && a[j]>=mid)
                j--;
            while(i!=j && a[i]<=mid)
                i++;
            char temp;
            if(i==j){
                temp = a[x];
                a[x] = a[i];
                a[i] = temp;
            }else{
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
        quicksort(a,x,i);
        quicksort(a,i+1,y);
    }
    public static boolean compare(String s1,String s2){
        if(s1.length()!=s2.length()){
            return false;
        }
        char[] c1 = s1.toCharArray();
        char[] c2 = s2.toCharArray();

        quicksort(c1,0,c1.length-1);
        quicksort(c2,0,c2.length-1);

        for(int i=0;i<c1.length;i++){
           if(c1[i] != c2[i])
            return false;
        }

        return true;
    }
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String s1,s2;
        s1 = scanner.nextLine();
        s2 = scanner.nextLine();
        if(compare(s1, s2)){
            System.out.println("相同");
        }else{
            System.out.println("不相同");
        }

    }
}

2.反转字符串,这个问题很直接了,就是将字符串顺序倒过来。
解决思路:思路1,这里用到了递归的思想。和反转二叉树的思路一样(二叉树是最能体现递归的数据结构),递归的方法是先把根的左右子树的位置调换了,再递归的把左右子树的根传给递归函数。字符的做法是,把字符串分为两半,把这两半位子调换,再对这两半字符串做同样处理。
思路2:感觉上面的用递归不直观,我们可以把字符串转为字符数组,头和尾每个字符调换就可以了。
代码:

package basic.recursion;

import java.util.Scanner;

/**
 * author tanbin 
 * 将字符串反转的几种方法
 * Created by Administrator on 2016/12/6.
 */
public class reverseString {
    public static String reverse(String s){
        if(s.length()<=1){
            return s;
        }
        String left = s.substring(0,s.length()/2);
        String right = s.substring(s.length()/2,s.length());
        return reverse(right)+reverse(left);
    }
    public static void reverse2(char[] c){
        int i=0;
        int j= c.length-1;
        char temp;
        while(i!=j && i<j){
            temp =c[i];
            c[i] = c[j];
            c[j] = temp;
            i++;
            j--;
        }
    }
    public static void reverse3(char[] c){//利用栈,知道大小的数组的情况下用栈有点多余。
        Stack stack = new Stack(new char[c.length]);
        for(int i=0;i<c.length;i++){
            stack.push(c[i]);
        }
        for(int j=0;j<c.length;j++){
            c[j] = stack.pop();
        }

    }
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        //reverse
        String s = reverse(scanner.nextLine());
        System.out.println(s);

        //reverse2
        char[] c = s.toCharArray();
        reverse2(c);
        for(int i=0;i<c.length;i++) {
            System.out.print(c[i]);
        }
        //reverse3
        reverse3(c);
        System.out.println();
        for(int i=0;i<c.length;i++) {
            System.out.print(c[i]);
        }
    }
}


class Stack{
    private char[] container;
    int top=-1;
    public  Stack(char[] c){
        this.container = c;
    }
    public void push(char c){
        top++;
        container[top] = c;
    }
    public char pop(){
        char pop = container[top];
        top--;
        return pop;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值