判斷一個字符串中的字符是否惟一(只用基本數據結構)

package cglib;java

import java.util.Arrays;算法

public class StringNumber {
    
    public static void main(String args[]) throws Exception{
        
        String str0="123qw&()";
        System.out.println("數組方法一:"+Array(str0));
        String str1="qwerABC";
        System.out.println("只有字母的位運算方法二:"+Bit(str1));
        String str2="q123";
        System.out.println("位運算方法三:"+Biter(str2));
        String str4="qwqewwr@#¥123";
        System.out.println("布爾運算方法四:"+Bool(str4));
        String str5="125asd";
        System.out.println("排序比較運算方法五:"+Sort(str5));
    }
    //時間複雜度爲O(n*n),空間複雜度爲O(1)
    public static boolean Array(String str){
        
        if(str==null||str==""){
            return true;
        }
        else if(str.length()>256){
            return false;
        }
        
        for(int i=0;i<str.length();i++){
            for(int j=i+1;j<str.length();j++){
                if(str.charAt(i)==str.charAt(j)){
                    return false;
                }
            }
            
        }
        return true;
        
        
    }
    
    public static boolean Bit(String str) throws Exception{
        if(str==null||str==""){
            return true;
        }
        else if(str.length()>26){
            return false;
        }
        int checkchar = 0;  //首先是26個0,也便是一個都沒有出現過  
         for(int i = 0; i < str.length(); i++)  
         {  
             if((str.charAt(i) < 'a' || str.charAt(i) > 'z')&&(str.charAt(i) < 'A' || str.charAt(i) > 'Z')) {
                 throw new Exception("字符串不符合要求");
           }
             int v = (int) str.charAt(i);
             //咱們判斷checkchar中是否含有這個字符的位置  
             
             int b=checkchar&(1 << v);
             if (b!=0){//判斷,若是是1&1的話,結果就是1,就是存在重複  
                 return false;
             }
             checkchar|=(1 << v); //把這個位置設置爲1
            
         }
        
        return true;
        
        
    }
    /**
     * 經過位運算來減小空間的使用量。
     * 用每一位表徵相應位置字符的出現。
     * 對於ASCII字符,咱們須要256位,即一個大小爲8的int 數組a便可。
     * 這裏的關鍵是要把字符對應的數字,映射到正確的位上去。
     * 好比字符'b'對應的 代碼是98.
     * 用98除以32,獲得對應數組a的下標:3。
     * 98對32取模獲得相應的位:2。
     * 該算法的時間複雜度爲O(n),須要的內存空間更小
     *
     */
    public static boolean Biter(String str){
        if(str==null||str==""){
            return true;
        }
        else if(str.length()>256){
            return false;
        }
        final int[] a = new int[8];//位運算時,256個字符須要8個整型數來表徵存儲位:256/32=8
        for (int i=0;i<str.length();++i) {
            int v = (int) str.charAt(i);
            int idx=v/32,shift=v%32;
            int b=a[idx]&(1 << shift);
            if (b!=0){
                return false;
            }
            a[idx]|=(1 << shift);
        }
        
        return true;
        
    }
    public static boolean Bool(String str){
        if(str==null||str==""){
            return true;
        }
        else if(str.length()>256){
            return false;
        }
        boolean[] bole=new boolean[256];//默認都爲false
        for(int i=0;i<str.length();++i){
            int a=(int)str.charAt(i);
            System.out.println(str.charAt(i));
            System.out.println("a="+a);
            if(bole[a]==true){//若是a對應的數組裏面是true,說明已經存在,參考用map判斷存在值的邏輯
                return false;
            }
            bole[a]=true;//至關於該值已經判斷了,作存在一次的標識。回頭再碰到相同的值,至關於索引一致,則數組裏面的值是固定的
        }
        
        return true;
        
        
    }
    
    public static boolean Sort(String str){
        if(str==null||str==""){
            return true;
        }
        else if(str.length()>26){
            return false;
        }
        char[] character =new char[str.length()];
        for(int i=0;i<str.length();i++){
            
            character[i]=str.charAt(i);
        }
        Arrays.sort(character);
         for (int i = 0; i < character.length - 1; i++) {
             if (character[i] == character[i + 1]) {
                 return false;
             }
            
            
        }
        return true;
        
    }
    }
    數組

    
   輸出:排序

數組方法一:true
只有字母的位運算方法二:true
位運算方法三:true
q
a=113
w
a=119
q
a=113
布爾運算方法四:false
排序比較運算方法五:true索引

相關文章
相關標籤/搜索