[Java 算法] 字符串

练习一 : 最长公共前缀

14. 最长公共前缀 - 力扣(LeetCode)

方法一 :

java 复制代码
class Solution {
    public String longestCommonPrefix(String[] strs) {
        int n = strs.length;
        String ret = strs[0];
        for(int i = 1;i<n;i++){
            ret = findComment(strs[i],ret);
        }
        return ret;
    }
    public String findComment(String str1,String str2){
        int i = 0;
        while(i<Math.min(str1.length(),str2.length())&&str1.charAt(i) == str2.charAt(i)) i++;
        return str1.substring(0,i);
    }
}

字符串数组看作一条链,依次两两比较,不断缩小公共前缀的范围

方法二 :

java 复制代码
class Solution {
    public String longestCommonPrefix(String[] strs) {
        int n = strs.length;
        String tmp = strs[0];
        for(int i = 0;i<tmp.length();i++){
            char s = tmp.charAt(i);
            for(int j = 1;j<strs.length;j++){
                if(i == strs[j].length()||(strs[j].charAt(i)!=s)){
                    return tmp.substring(0,i);
                }
            }
        }
        return tmp;
    }
}

以第一个字符串为基准,逐字符地去对比其他所有字符串。

练习二 : 最长回文子串

5. 最长回文子串 - 力扣(LeetCode)

java 复制代码
class Solution {
    public String longestPalindrome(String s) {
        int begin = 0,len = 0;
        int n = s.length();
        for(int i = 0;i<n;i++){
            //先扩展奇数长度
            int left = i,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);
    }
}

中心扩展算法 , 分别枚举奇数长度以 i 为中心的子串 , 和偶数长度以 i 为中心的子串

练习三 : 二进制求和

67. 二进制求和 - 力扣(LeetCode)

java 复制代码
class Solution {
    public String addBinary(String a, String b) {
        int cur1 = a.length()-1,cur2 = b.length()-1,t = 0;
        StringBuffer s = new StringBuffer();
        while(cur1>=0||cur2>=0||t>0){
            if(cur1>=0) t+=a.charAt(cur1--)-'0';
            if(cur2>=0) t+=b.charAt(cur2--)-'0';
            s.append(""+t%2);
            t/=2;
        }
        s.reverse();
        return s.toString();
    }
}

模拟加法列竖式运算

相加 : 前一位的进位 t+=两数的当前位 , 满 2 进 1 : t%2

进位 : t/=2

从最低位开始拼字符串 , 最低位在字符串的起始位置 , 最终得到的数是逆序的

练习四 : 字符串相乘

43. 字符串相乘 - 力扣(LeetCode)

java 复制代码
class Solution {
    public String multiply(String num1, String num2) {
        num1 = new StringBuilder(num1).reverse().toString();
        num2 = new StringBuilder(num2).reverse().toString();
        int n1 = num1.length(),n2 = num2.length();
        int[]tmp = new int[n1+n2-1];
        for(int i = 0;i<n1;i++){
            for(int j = 0;j<n2;j++){
                int a = num1.charAt(i)-'0';
                int b = num2.charAt(j)-'0';
                tmp[i+j]+=a*b;
            }
        }
        StringBuffer ret = new StringBuffer();
        int index = 0,t = 0;
        while(index<tmp.length||t!=0){
            if(index<tmp.length) t+=tmp[index++];
            ret.append(t%10+"");
            t/=10;
        }
        ret.reverse();
        // 处理前导 0
        while (ret.length() > 1 && ret.charAt(0) == '0') {
            ret.deleteCharAt(0);
        }
        return ret.toString();
    }
}

1.字符串逆转

2.将两个字符串 第 i 位 × 第 j 位 存放在 tmp\[\] 的 i+j 位 ; 只累加不进位

3.模拟字符串相加

相关推荐
克里斯蒂亚诺更新6 分钟前
一个服务器访问另外一个服务器端口页面
运维·服务器
Land032913 分钟前
财务RPA落地指南:银企对账、发票三单匹配、ERP台账自动化,RPA离线方案解析
服务器·自动化·rpa
12.=0.14 分钟前
【持续更新】shell脚本 + Linux命令
linux·运维·服务器
Escalating_xu21 分钟前
【Linux 网络编程】五种 I/O 模型与非阻塞 I/O:从“等数据”到正确处理 EAGAIN
java·linux·网络
AiNightVision1 小时前
无人机夜视模块如何选择?——从参数指标到系统集成的完整选型指南
人工智能·算法·计算机视觉·车载系统·无人机·视频·智能硬件
无言听风雨丶1 小时前
Linux 容器本质探秘:Cgroup 与 Namespace 深度解析与实战
linux·运维·服务器·kubernetes
万联WANFLOW1 小时前
CVE-2026-98432 等漏洞自查:AI 查出的 Linux、Windows 漏洞,运维怎么确认受不受影响
linux·运维·windows·网络安全
debugdynamo1 小时前
Netcatty:把 SSH 客户端做回工作台
运维·其他·ssh
时空无限1 小时前
ssh 直接免密输入 sudo 密码
运维·ssh
OPEN-F1 小时前
Ubuntu 自动登录后 GNOME 远程桌面连不上?一次登录钥匙环锁定的排查与永久修复
linux·运维·ubuntu