字符串 算法专题

一. 最长公共前缀

最长公共前缀

class Solution {
    
    
    public String longestCommonPrefix(String[] strs) {
    
    
       for(int i = 0; i < strs[0].length(); i++){
    
    
            char tmp = strs[0].charAt(i);
            //后面的都与第一个作比较
            for(int j = 1; j < strs.length; j++){
    
    
                //如果有一个长度达不到或者不一致, 则直接返回(0,i)的字符
                if(i == strs[j].length() || strs[j].charAt(i) != tmp ){
    
    
                    return strs[0].substring(0, i);
                }
            }
       }
       //第一个字符串全部是公共前缀
       return strs[0];
    }
}

二. 最长回文子串

最长回文子串

class Solution {
    
    
    public String longestPalindrome(String s) {
    
    
        int len = 0;
        int begin = 0;
        int n = s.length();
        //从一个中心点出发, 利用回文的特性
        for(int i = 0; i < n; i++){
    
    
            //遍历奇数情况
            int left = i;
            int right = i;
            while(left >= 0 && right != n && s.charAt(left) == s.charAt(right)){
    
    
                left--;
                right++;
            }
            if(right - left - 1 > len){
    
    
                begin = left + 1;
                len = right - left - 1;
            }
            //遍历偶数情况
            left = i;
            right = i + 1;
            while(left >= 0 && right != n && s.charAt(left) == s.charAt(right)){
    
    
                left--;
                right++;
            }
            if(right - left - 1 > len){
    
    
                begin = left + 1;
                len = right - left - 1;
            }
        }
        return s.substring(begin, begin + len);
    }
}

三. 二进制求和

二进制求和

class Solution {
    
    
    public String addBinary(String a, String b) {
    
    
        StringBuffer ret = new StringBuffer();
        int cur1 = a.length() - 1;
        int cur2 = b.length() - 1;
        int t = 0;
        while (cur1 >= 0 || cur2 >= 0 || t != 0) {
    
    
            if (cur1 >= 0)
                t += a.charAt(cur1--) - '0';
            if (cur2 >= 0)
                t += b.charAt(cur2--) - '0';
            ret.append(t % 2);
            t = t / 2;

        }
        ret.reverse();
        return ret.toString();
    }
}

四. 字符串相乘

字符串相乘

class Solution {
    
    
    public String multiply(String num1, String num2) {
    
    
        //逆序, 后续好操作
        char[] n1 = new StringBuffer(num1).reverse().toString().toCharArray();
        char[] n2 = new StringBuffer(num2).reverse().toString().toCharArray();
        int n = n1.length;
        int m = n2.length;
        int[] tmp = new int[m + n - 1];

        //相乘, 不处理进位
        for(int i = 0; i < n; i++){
    
    
            for(int j = 0; j < m; j++){
    
    
                tmp[i + j] += (n1[i] - '0') * (n2[j] - '0');
            }
        }
        //处理进位
        int cur = 0; 
        int t = 0;
        StringBuffer ret = new StringBuffer();
        while(cur < tmp.length || t != 0){
    
    
            if(cur < tmp.length) t += tmp[cur++];
            ret.append(t % 10);
            t /= 10;
        }
        
        //处理前导0
        while(ret.length() > 1 && ret.charAt(ret.length() - 1) == '0'){
    
    
            ret.deleteCharAt(ret.length() - 1);
        }

        return ret.reverse().toString();
    }
}

猜你喜欢

转载自blog.csdn.net/m0_73992740/article/details/143328499