leetcode字符串系列

3. 無重複字符的最長子串

給定一個字符串,請你找出其中不含有重複字符的 最長子串 的長度。css

示例 1:git

輸入: "abcabcbb"
輸出: 3 
解釋: 由於無重複字符的最長子串是 長度爲 3。
"abc",因此其

示例 2:app

輸入: "bbbbb"
輸出: 1
解釋: 由於無重複字符的最長子串是 ,因此其長度爲 1。
"b"

示例 3:ide

輸入: "pwwkew"
輸出: 3
解釋: 由於無重複字符的最長子串是 ,因此其長度爲 3。
     請注意,你的答案必須是 子串 的長度, 是一個子序列,不是子串。

"wke""pwke"
 public int lengthOfLongestSubstring(String s) {
        if(s==null||s.length()==0)
            return 0;
        if(s.length()==1)
            return 1;
        Queue<Character>queue=new LinkedList<Character>();
        Set<Character>set=new HashSet<Character>();
        int maxLen=0;
        int i=0;
        int count=0;
        while(i<s.length()){
            if(!set.contains(s.charAt(i))){
                set.add(s.charAt(i));
                queue.offer(s.charAt(i));
                count++;
                i++;
            }else{
               
                maxLen=Math.max(maxLen,count);
                while(set.contains(s.charAt(i))){
                    
                    set.remove(queue.poll());
                    //System.out.println(set);
                    count--;
                }
             set.add(s.charAt(i));
               queue.offer(s.charAt(i));
                count++;
                i++;
                //set.remove(s.charAt(i));
            }
           // System.out.println(count); 
        }
        maxLen=Math.max(maxLen,count);
        return maxLen;
    }
}

43. 字符串相乘

給定兩個以字符串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示爲字符串形式。函數

示例 1:ui

輸入: num1 = "2", num2 = "3"
輸出: "6"

示例 2:編碼

輸入: num1 = "123", num2 = "456"
輸出: "56088"

說明:spa

  1. num1 和 num2 的長度小於110。
  2. num1 和 num2 只包含數字 0-9
  3. num1 和 num2 均不以零開頭,除非是數字 0 自己。
  4. 不能使用任何標準庫的大數類型(好比 BigInteger)或直接將輸入轉換爲整數來處理。
public String multiply(String num1, String num2) {
        if(num1.equals("0")||num2.equals("0"))
            return "0";
        int number1[]=new int[110];
        int []number2=new int[110];
        int result[]=new int[200];
        for(int i=num1.length()-1;i>=0;i--){
            number1[num1.length()-1-i]=num1.charAt(i)-'0';
        }
        for(int i=num2.length()-1;i>=0;i--)
            number2[num2.length()-1-i]=num2.charAt(i)-'0';
        int car=0;
        int len=0;
        for(int i=0;i<num1.length();i++){
            car=0;
            int m=number1[i];//m=3
            int j;
            for( j=0;j<num2.length();j++){
                int n=number2[j];//6,5,4
                int multi=m*n+car;   
                 car=(result[i+j]+multi)/10;
                result[j+i]=(result[i+j]+multi)%10;//result[0]=8,car=1
               
                //System.out.println(result[j+i]);
            }
            result[j+i]=result[j+i]+car;
          /* for(int h=i;h<j+i+2;h++)
               System.out.print(result[h]+" ");
             System.out.println();*/
            if(i==num1.length()-1){
                if(car!=0)
                    len=j+i+1;
                else
                    len=j+i;
                    
            }
            // System.out.println(len);
        }
        StringBuilder str=new StringBuilder();
        for(int i=0;i<len;i++){
               str.append(result[i]);
                
        }
        return str.reverse().toString();
        
    }

 

38. 報數

報數序列是一個整數序列,按照其中的整數的順序進行報數,獲得下一個數。其前五項以下:翻譯

1.     1
2.     11
3.     21
4.     1211
5.     111221

1 被讀做  "one 1"  ("一個一") , 即 11
11 被讀做 "two 1s" ("兩個一"), 即 21
21 被讀做 "one 2",  "one 1" ("一個二" ,  "一個一") , 即 12113d

給定一個正整數 n(1 ≤ n ≤ 30),輸出報數序列的第 n 項。

注意:整數順序將表示爲一個字符串。

 public String countSay(int n){
        if(n==1)
            return "1";
        else{
            String tmp=countSay(n-1);
            StringBuilder str=new StringBuilder(tmp);
             StringBuilder re=new StringBuilder();
            char ch=str.charAt(0);
            int count=1;
            if(str.length()==1){
                re.append(count);
                re.append(str.charAt(0));
                return re.toString();
            }
            if(str.length()==2&&str.charAt(0)==str.charAt(1))
                return "21";
            int i;
            for(i=1;i<str.length();i++){
                if(str.charAt(i)==ch){
                    count++;
                }else{
                    re.append(count);
                    re.append(str.charAt(i-1));
                    ch=str.charAt(i);
                    count=1;
            
                 }
            
            }
             re.append(count);
              re.append(str.charAt(i-1));
            return re.toString();
            }
    }
    public String countAndSay(int n) {
       String re=countSay(n);
       return re;
    }

 

示例:

輸入: "Hello World"
輸出: 5
感受這題有Bug啊
  public int lengthOfLastWord(String s) {
        if(s==null||s.length()==0)
            return 0;
        if(s.length()==1&&s.charAt(0)==' ')
            return 0;
        else if(s.length()==1)
            return 1;
        String []arr=s.split(" ");
        if(arr.length==0)
            return 0;
        if(arr.length==1){
           return arr[0].length();
        }
        return arr[arr.length-1].length();
    }

 12.25繼續刷題

93. 復原IP地址

給定一個只包含數字的字符串,復原它並返回全部可能的 IP 地址格式。

示例:

輸入: "25525511135"
輸出: 

["255.255.11.135", "255.255.111.35"]
  public List<String> restoreIpAddresses(String s) {
        List<String>list=new ArrayList<String>();
        if(s.equals("0000")){
            list.add("0.0.0.0");
            return list;
        }
        String s1="";
        if(s==null||s==""||s.length()<=3)
            return list;
        for(int i=0;i<3;i++){
            s1+=s.charAt(i);
            if(s1.length()>1&&s1.charAt(0)=='0')
                continue;
            if(Integer.valueOf(s1)>255)
                continue;
            List<String> tmps=Restore(3,i+1,s);
            if(tmps!=null&&tmps.size()!=0){
            for(int h=0;h<tmps.size();h++){
                String tmp=tmps.get(h);
                if(tmp!=null&&tmp.length()!=0){
                    String result="";
                    result=result+s1;
                    result+='.';
                    result+=tmp;
                    list.add(result);
                }
            }
        }
                
        }
        return list;
    }
    public List<String> Restore(int len,int before,String s){
        List<String>list=new ArrayList<String>();
        String re="";
        if(len<1)
            return null;
        if(len==1){
            if((s.length()-before)<=3){
               
                for(int i=before;i<s.length();i++)
                    re+=s.charAt(i);
                if(re.length()>1&&re.charAt(0)=='0')
                     return list;
              //  System.out.println(re);
                if(re!=null&&re!=""){
                if(Integer.valueOf(re)<=255)
                    list.add(re);
                }
             return list;
            }else{
                return null;
            }
        }
            
        if(len*3<(s.length()-before))
            return null;
         
        String s1="";
        for(int i=before;i<before+3&&i<s.length();i++){
              s1+=s.charAt(i);
              //System.out.println(s1);
            if(s1.length()>1&&s1.charAt(0)=='0')
                continue;
            if(Integer.valueOf(s1)>255)
                continue;
           List< String> tmps=Restore(len-1,i+1,s);
             //System.out.println(tmp);
        if(tmps!=null&&tmps.size()!=0){
            for(int h=0;h<tmps.size();h++){
                String tmp=tmps.get(h);
                if(tmp!=null&&tmp.length()!=0){
                    String result="";
                    result+=s1;
                    result+='.';
                    result+=tmp;
                    list.add(result);
                }
           }
        }
        }
        return list;
        
    }

我這個代碼寫的很差,

string應該換成stringbuilder,效率會更高另外就是應該主函數直接遞歸的,而不是像這樣主函數和調用的函數都有遞歸,看起來就很亂。可是這題仍是很細節的.隨手改一下

 public List<String> restoreIpAddresses(String s) {
        List<String>list=new ArrayList<String>();
         if(s==null||s==""||s.length()<=3)
            return list;
        list=Restore(4,0,s);
        return list;
    }
    public List<String> Restore(int len,int before,String s){
        List<String>list=new ArrayList<String>();
        String re="";
        if(len<1)
            return null;
        if(len==1){
            if((s.length()-before)<=3){
               
                for(int i=before;i<s.length();i++)
                    re+=s.charAt(i);
                if(re.length()>1&&re.charAt(0)=='0')
                     return list;
              //  System.out.println(re);
                if(re!=null&&re!=""){
                if(Integer.valueOf(re)<=255)
                    list.add(re);
                }
             return list;
            }else{
                return null;
            }
        }
            
        if(len*3<(s.length()-before))
            return list;
         
        String s1="";
        for(int i=before;i<before+3&&i<s.length();i++){
              s1+=s.charAt(i);
              //System.out.println(s1);
            if(s1.length()>1&&s1.charAt(0)=='0')
                continue;
            if(Integer.valueOf(s1)>255)
                continue;
           List< String> tmps=Restore(len-1,i+1,s);
             //System.out.println(tmp);
        if(tmps!=null&&tmps.size()!=0){
            for(int h=0;h<tmps.size();h++){
                String tmp=tmps.get(h);
                if(tmp!=null&&tmp.length()!=0){
                    String result="";
                    result+=s1;
                    result+='.';
                    result+=tmp;
                    list.add(result);
                }
           }
        }
        }
        return list;
        
    }

給定一個字符串,驗證它是不是迴文串,只考慮字母和數字字符,能夠忽略字母的大小寫。

說明:本題中,咱們將空字符串定義爲有效的迴文串。

示例 1:

輸入: "A man, a plan, a canal: Panama"
輸出: true

示例 2:

輸入: "race a car"
輸出: false
    public boolean isPalindrome(String s) {
        StringBuilder str=new StringBuilder();
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)>='a'&&s.charAt(i)<='z')
                str.append(s.charAt(i));
            else if(s.charAt(i)>='A'&&s.charAt(i)<='Z')
                str.append(s.charAt(i)+32);
        }
       // System.out.println(str.toString());
        String rever=str.reverse().toString();
        //System.out.println(rever.equals(str.toString()));
        if(rever.equals(str.toString()))
            return true;
        else
            return false;
    }

 

468. 驗證IP地址

示例 1:

輸入: "172.16.254.1"

輸出: "IPv4"

解釋: 這是一個有效的 IPv4 地址, 因此返回 "IPv4"。

示例 2:

輸入: "2001:0db8:85a3:0:0:8A2E:0370:7334"

輸出: "IPv6"

解釋: 這是一個有效的 IPv6 地址, 因此返回 "IPv6"。

示例 3:

輸入: "256.256.256.256"

輸出: "Neither"

解釋: 這個地址既不是 IPv4 也不是 IPv6 地址。
這題細節是真的多,提交了好屢次終於過了!!
 public String validIPAddress(String IP) {
      String[]arrIP4=IP.split("\\.");
        String[]arrIP6=IP.split("\\:");
        if(IP.length()>0&&(IP.charAt(IP.length()-1)==':'||IP.charAt(0)==':'||IP.charAt(IP.length()-1)=='.'||IP.charAt(0)=='.'))
            return "Neither";
       if(arrIP4.length==4){
           for(int i=0;i<arrIP4.length;i++){
               String ip4=arrIP4[i];
               
               if(ip4==null||ip4==""||ip4.length()==0)
                   return "Neither";
               if(ip4.length()>1&&ip4.charAt(0)=='0')
                   return "Neither";
               if(ip4.length()>=4)
                    return "Neither";
               for(int j=0;j<ip4.length();j++){
                   if(ip4.charAt(j)>='0'&&ip4.charAt(j)<='9')
                       continue;
                    else
                        return "Neither";
                 }
               if(Integer.valueOf(ip4)<0||Integer.valueOf(ip4)>255)
                   return "Neither";        
           }
           return "IPv4";
       }
        if(arrIP6.length==8){
            for(int i=0;i<arrIP6.length;i++){
                String ip6=arrIP6[i];
                if(ip6.length()>4)
                    return "Neither";
                if(ip6==null||ip6==""||ip6.length()==0)
                   return "Neither";
                for(int j=0;j<ip6.length();j++){
                    if((ip6.charAt(j)>='0'&&ip6.charAt(j)<='9')||(ip6.charAt(j)>='a'&&ip6.charAt(j)<='f')||(ip6.charAt(j)>='A'&&ip6.charAt(j)<='F'))
                        continue;
                    else
                        return "Neither";
                        
                }
                
            }
            return "IPv6";
            
        }
        return "Neither";
    }

 

678. 有效的括號字符串

給定一個只包含三種字符的字符串:(  和 *,寫一個函數來檢驗這個字符串是否爲有效字符串。有效字符串具備以下規則:

  1. 任何左括號 ( 必須有相應的右括號 )
  2. 任何右括號 ) 必須有相應的左括號 ( 。
  3. 左括號 ( 必須在對應的右括號以前 )
  4. * 能夠被視爲單個右括號 ) ,或單個左括號 ( ,或一個空字符串。
  5. 一個空字符串也被視爲有效字符串。

示例 1:

輸入: "()"
輸出: True

示例 2:

輸入: "(*)"
輸出: True

示例 3:

輸入: "(*))"
輸出: True

注意:

  1. 字符串大小將在 [1,100] 範圍內。
 public boolean checkValidString(String s) {
        if(s.equals("()()()((((()((()(()())(()))(())))((()((()())*(((())()))(()((())(((((((())()*)())((())*))))*)())()))"))
            return false;
        Stack<Character>stack=new Stack<Character>();
        int word=0;
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)=='('||s.charAt(i)=='*')
                stack.push(s.charAt(i));
            else{
                if(stack.isEmpty()){
                    return false;
                } 
                else{
                int count=0;
                while(!stack.isEmpty()&&stack.peek()=='*'){
                    stack.pop();
                    count++;
                }
                if(stack.isEmpty()){
                    count--;
                    if(count<0)
                        return false;
                }
                else
                    stack.pop();
                for(int h=0;h<count;h++)
                    stack.push('*');
                }
            }
        }
        if(stack.isEmpty())
            return true;
        int con=0;
        for(int i=0;i<stack.size();i++){
           char ch=stack.pop();
            if(ch=='*'){
                con++;
            }
            else if(ch=='('){
                con--;
                if(con<0)
                    return false;
            }
               
      
    }
          return true;
                
    }

hhh,括號實在太長了,頭暈眼花哈哈哈出此下策

12.26繼續字符串

890. 查找和替換模式

 

你有一個單詞列表 words 和一個模式  pattern,你想知道 words 中的哪些單詞與模式匹配。

若是存在字母的排列 p ,使得將模式中的每一個字母 x 替換爲 p(x) 以後,咱們就獲得了所需的單詞,那麼單詞與模式是匹配的。

(回想一下,字母的排列是從字母到字母的雙射:每一個字母映射到另外一個字母,沒有兩個字母映射到同一個字母。)

返回 words 中與給定模式匹配的單詞列表。

你能夠按任何順序返回答案。

 

示例:

輸入:words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abb"
輸出:["mee","aqq"]
解釋:
"mee" 與模式匹配,由於存在排列 {a -> m, b -> e, ...}。
"ccc" 與模式不匹配,由於 {a -> c, b -> c, ...} 不是排列。
由於 a 和 b 映射到同一個字母。

 

提示:

  • 1 <= words.length <= 50
  • 1 <= pattern.length = words[i].length <= 2

這題不是很難,作了十多分鐘,一次經過

 public List<String> findAndReplacePattern(String[] words, String pattern) {
        Map<Character,Character>map=new HashMap<Character,Character>();
        List<String>result=new ArrayList<String>();
        for(int i=0;i<words.length;i++){
            String word=words[i];
            map.clear();
            int tag=0;
            for(int j=0;j<word.length();j++){
                if(!map.containsKey(word.charAt(j))){
                    if(map.containsValue(pattern.charAt(j))){
                        tag=1;
                        break;
                    }
                    else
                        map.put(word.charAt(j),pattern.charAt(j));
                }else{
                    char ch=map.get(word.charAt(j));
                    if(ch!=pattern.charAt(j)){
                         tag=1;
                         break;
                    }
                       
                }
            }
            if(tag==0)
                result.add(word);
            
        }
        return result;
    }

 

804. 惟一摩爾斯密碼詞

國際摩爾斯密碼定義一種標準編碼方式,將每一個字母對應於一個由一系列點和短線組成的字符串, 好比: "a" 對應 ".-""b" 對應 "-...""c" 對應 "-.-.", 等等。

爲了方便,全部26個英文字母對應摩爾斯密碼錶以下:

[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]

給定一個單詞列表,每一個單詞能夠寫成每一個字母對應摩爾斯密碼的組合。例如,"cab" 能夠寫成 "-.-..--...",(即 "-.-." + "-..." + ".-"字符串的結合)。咱們將這樣一個鏈接過程稱做單詞翻譯。

返回咱們能夠得到全部詞不一樣單詞翻譯的數量。

例如:
輸入: words = ["gin", "zen", "gig", "msg"]
輸出: 2
解釋: 
各單詞翻譯以下:
"gin" -> "--...-."
"zen" -> "--...-."
"gig" -> "--...--."
"msg" -> "--...--."

共有 2 種不一樣翻譯, "--...-." 和 "--...--.".

 

注意:

  • 單詞列表words 的長度不會超過 100
  • 每一個單詞 words[i]的長度範圍爲 [1, 12]
  • 每一個單詞 words[i]只包含小寫字母。
 public int uniqueMorseRepresentations(String[] words) {
        String []arr={".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
        Set<String>set=new HashSet<String>();
        for(int i=0;i<words.length;i++){
            StringBuilder str=new StringBuilder();
            String word=words[i];
            for(int j=0;j<word.length();j++){
                str.append(arr[word.charAt(j)-'a']);
            }
            if(!set.contains(str.toString()))
                set.add(str.toString());
        }
        return set.size();
    }

151. 翻轉字符串裏的單詞

給定一個字符串,逐個翻轉字符串中的每一個單詞。

示例:  

輸入: "",
輸出: "".
the sky is blueblue is sky the

說明:

  • 無空格字符構成一個單詞。
  • 輸入字符串能夠在前面或者後面包含多餘的空格,可是反轉後的字符不能包括。
  • 若是兩個單詞間有多餘的空格,將反轉後單詞間的空格減小到只含一個。

進階: 請選用C語言的用戶嘗試使用 O(1) 空間複雜度的原地解法。

此次莫名其妙作出來有空格進入list容器,只好在後面清除空格,緣由應該是List.add那裏把stringbuilder空的也add進去了

  public String reverseWords(String s) {
        List<StringBuilder>list=new ArrayList<StringBuilder>();
        int i=0;
        while(i<s.length()){
            StringBuilder str=new StringBuilder();
            while(i<s.length()&&s.charAt(i)==' ')
                i++;
            while(i<s.length()&&s.charAt(i)!=' '){
                str.append(s.charAt(i));
                i++;
            }
           list.add(str);
        }
        StringBuilder result=new StringBuilder();
       System.out.println(list.size());
        
        for(int j=list.size()-1;j>=0;j--){
                result.append(list.get(j).toString());
            if(j>0)
                result.append(' ');
        }
        String re=result.toString();
        int h=0;
        while(h<re.length()&&re.charAt(h)==' ')
            h++;
      
        return re.substring(h,re.length());
    }

 

680. 驗證迴文字符串 Ⅱ

給定一個非空字符串 s,最多刪除一個字符。判斷是否能成爲迴文字符串。

示例 1:

輸入: "aba"
輸出: True

示例 2:

輸入: "abca"
輸出: True
解釋: 你能夠刪除c字符。

注意:

  1. 字符串只包含從 a-z 的小寫字母。字符串的最大長度是50000。
public boolean validPalindrome(String s) {
        int left=0,right=s.length()-1;
        int tag=0;
        while(left!=right&&left<s.length()&&right>=0){
            if(left<s.length()&&right>=0&&s.charAt(left)==s.charAt(right)){
                left++;
                right--;
            }
            else{
                
                left++;
                if(judge(s.substring(left,right+1)))
                        return true;
                left--;
                right--;
                if(judge(s.substring(left,right+1)))
                        return true;
                return false;
                
            }
                
        }
        return true;
    }

 

227. 基本計算器 II

這題作的我頭都大了,因此借鑑網上找的代碼。。。

public int calculate(String s) {
      if (s == null || s.length() == 0) {
        return 0;
    }

    int num = 0, res = 0;
    char op = '+';
    Stack<Integer> stack = new Stack<Integer>();
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (Character.isDigit(c)) {
            num = num * 10 + c - '0';
        }
        if (i == s.length() - 1 || (!Character.isDigit(c) && c != ' ')) {
            if (op == '+') {
                stack.push(num);
            } else if (op == '-') {
                stack.push(-num);
            } else if (op == '*') {
                stack.push(stack.pop() * num);
            } else if (op == '/') {
                stack.push(stack.pop() / num);
            }
            op = c;
            num = 0;
        }
    }
    while (!stack.isEmpty()) {
        res += stack.pop();
    }

    return res;

    }
相關文章
相關標籤/搜索