字符串专题leetcode例题

  1. List item

例 leetcode 49. 字母异位词分组

排序,hashmap分组,

    public List<List<String>> groupAnagrams(String[] strs) {
        ArrayList<List<String>> results = new ArrayList<List<String>>();
        if(strs==null||strs.length==0)return results;
        HashMap<String,List<String>>map = new HashMap<String,List<String>>();
        for(int i =0;i<strs.length;i++){
            char[]curr = strs[i].toCharArray();
            Arrays.sort(curr);
            String key = String.valueOf(curr);
            if(!map.containsKey(key))
                map.put(key,new ArrayList<String>());
            map.get(key).add(strs[i]);
        }    
    return new ArrayList<List<String>>(map.values());
    }

例 leetcode 151 反转字符串里的单词

先反转字符串的每个单词
再反转字符串
这里要熟悉substring()不是大写。(左闭右开)。
还有stringbuffer的使用方法。与string的转换。
考虑到java字符串不可变,可能转换为数组操作更好一些。
另外还有栈的思路可以考虑配合字符数组。待实现。

    public String reverseWords(String s) {
        String res="";
        for(int i=0;i<s.length();i++){
            while(i<s.length()&&s.charAt(i)==' ')i++;
            int j=i;
            if(i==s.length())break;
            while(j<s.length()&&s.charAt(j)!=' ')j++;
            res=res+new StringBuffer(s.substring(i,j)).reverse().toString()+' ';
            i=j;
        }
        if(res.length()==0)return "";
        return new StringBuffer(res).reverse().toString().substring(1);
    }

例 leetcode165 比较版本号

代码还可以用问号表达式简化。

    public int compareVersion(String version1, String version2) {
        String []array1= version1.split("\\.");
        String []array2= version2.split("\\.");
        int i=0,j=0;
        while(i<array1.length&&j<array2.length){
            int val1=Integer.parseInt(array1[i]);
            int val2=Integer.parseInt(array2[j]);
            if(val1>val2)return 1;
            if(val1<val2)return -1;
            i++;
            j++;
        }
        if(i==array1.length&&j==array2.length)
            return 0;
        if(i==array1.length){
           while(j<array2.length){
               int val2=Integer.parseInt(array2[j]);
               if(val2!=0)return -1;
               j++;
           } 
            return 0;
        }
        if(j==array2.length){
           while(i<array1.length){
               int val1=Integer.parseInt(array1[i]);
               if(val1!=0)return 1;
               i++;
           } 
            return 0;
        }
        return 0;
    }

例 leetcode5 最长回文子串

枚举的方法,枚举所有的中心点。

奇数中心点就是一个。
偶数中心点就是两个。

    public String longestPalindrome(String s) {
        String res="";
        for(int i =0;i<s.length();i++){
            for(int j=i,k=i;j>=0&&k<s.length()&&s.charAt(j)==s.charAt(k);j--,k++)
                if(res.length()<k-j+1)
                    res=s.substring(j,k+1);
            for(int j=i,k=i+1;j>=0&&k<s.length()&&s.charAt(j)==s.charAt(k);j--,k++)
                if(res.length()<k-j+1)
                    res=s.substring(j,k+1);
        }
        return res;
    }

例 leetcode 6 Z字形变换

C++代码

按顺序依次填入

    string convert(string s, int numRows) {
        if (numRows == 1) return s;
        vector<string> rows(min(numRows, int(s.size())));
        int curRow = 0;
        bool goingDown = false;
        for (char c : s) {
            rows[curRow] += c;
            if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;
            curRow += goingDown ? 1 : -1;
        }
        string ret;
        for (string row : rows) ret += row;
        return ret;
    }

找规律也可以做

第一行等差数列
下面是两个交错的等差数列
最后是等差数列

例 leetcode 3 无重复的最长子串

HashMap可能更好。

    public int lengthOfLongestSubstring(String s) {
      Scanner input = new Scanner(System.in);
      int ans=0;
      Set<Character> charSet = new HashSet<>();
      for(int i =0,j=0;j<s.length()&&i<s.length();){
        if(!charSet.contains(s.charAt(j))){
          charSet.add(s.charAt(j));
          j++;
          ans=Math.max(ans,j-i);
        }
        else{
          charSet.remove(s.charAt(i++));
        }
      }
    return ans;
    }

例 leetcode 273 整数转英文表示

写起来有点麻烦

例 leetcode125. 验证回文串

可以通过阿斯克码判断,这里调用一下Character的函数,熟练一下。

    public boolean isPalindrome(String s) {
        char []array= s.toCharArray();
        int j=0;
        for(int i=0;i<array.length;i++)
            if(Character.isDigit(array[i])||Character.isLetter(array[i])){
                array[j]=array[i];
                j++;
            }
        String s1=String.valueOf(array).substring(0,j).toLowerCase();
        System.out.print(s1);
        String s2 = new StringBuffer(s1).reverse().toString().toLowerCase();
        return s1.equals(s2);
    }

例 leetcode205 同构字符串

两次hash,对比。一次会出现一些情况搞不定

    public boolean isIsomorphic(String s, String t) {
        HashMap<Character,Character>map = new HashMap<>();
        for(int i =0;i<s.length();i++){
            if(map.containsKey(s.charAt(i))){
                if(t.charAt(i)!=map.get(s.charAt(i)))
                    return false;
            }else
                map.put(s.charAt(i),t.charAt(i));
        }
        map.clear();
        for(int i =0;i<s.length();i++){
            if(map.containsKey(t.charAt(i))){
                if(s.charAt(i)!=map.get(t.charAt(i)))
                    return false;
            }else
                map.put(t.charAt(i),s.charAt(i));
        }
        return true;
    }

例 leetcode 290 单词规律

与上一题极其相似

    public boolean wordPattern(String pattern, String str) {
        HashMap<Character,String>map1 = new HashMap<>();
        HashMap<String,Character>map2 = new HashMap<>();
        String []array = str.split(" ");
        if(array.length!=pattern.length())return false;
        for(int i =0;i<pattern.length();i++){
            if(map1.containsKey(pattern.charAt(i))){
                if(!array[i].equals(map1.get(pattern.charAt(i))))
                    return false;
            }else
                map1.put(pattern.charAt(i),array[i]);
        }
        for(int i =0;i<pattern.length();i++){
            if(map2.containsKey(array[i])){
                if(pattern.charAt(i)!=map2.get(array[i]))
                    return false;
            }else
                map2.put(array[i],pattern.charAt(i));
        }
        return true;
    }

猜你喜欢

转载自blog.csdn.net/tianyouououou/article/details/105208750