算法题目---字符串

(一).介绍

字符串的算法题目,都是和别的算法结合来去出题的,例如,模拟,高精度加减等等

(二).具体题目

1.最长公共前缀

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

解法:模拟

java 复制代码
class Solution {
    public String longestCommonPrefix(String[] strs) {
        int len=strs.length;
        int len0=strs[0].length();  //以第一个字符串的长度为标准
        for (int i = 0; i < len0; i++) {
            char ch=strs[0].charAt(i);  //以第一个字符串的第i个字符为标准
            for (int j = 0; j < len; j++) {
                if (i==strs[j].length()||strs[j].charAt(i)!=ch){
                    return strs[0].substring(0,i);
                }
            }
        }
        return strs[0];
    }
}

2.最长回文子串

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

解法:中心扩展算法

java 复制代码
class Solution {
    public String longestPalindrome(String s){
        int begin=0; //记录开始位置
        int len=0;   //记录最长回文串的长度
        int lenS=s.length();
        for (int i = 0; i < lenS; i++) {  //固定所有的中间点
            //扩展奇数长度的子串
            int left=i;
            int right=i;
            while (left>=0 && right<lenS && s.charAt(left)==s.charAt(right)){
                left--;
                right++;
            }
            //取最长长度的回文子串
            if (right-left-1>len){   // 当执行到这里的时候,说明 s.charAt(left)和 s.charAt(right) 不相等了,那么相等的部分为 left+1  和  right-1
                begin=left+1;
                len=right-left-1;
            }

            //扩展偶数长度的子串
            left=i;
            right=i+1;
            while (left>=0 && right<lenS &&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);
    }
}

3.二进制求和

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

解法:模拟列竖式计算

java 复制代码
class Solution {
    public String addBinary(String a, String b){
        StringBuilder stringBuilder=new StringBuilder();
        int cur1=a.length()-1;
        int cur2=b.length()-1;
        int t=0;  //表示进位
        while (cur1>=0||cur2>=0){
            if (cur1>=0){
                int value_A = a.charAt(cur1)-'0';
                t+=value_A;
                cur1--;
            }
            if (cur2>=0){
                int value_B=b.charAt(cur2)-'0';
                t+=value_B;
                cur2--;
            }
            stringBuilder.append(t%2);  //由于是逢2进1,所以要%2
            t/=2;
        }
        if (t==1){  //处理特殊情况
            stringBuilder.append("1");
        }
        stringBuilder.reverse();  //由于添加的时候是正着添加的,所以要进行逆序
        return stringBuilder.toString();
    }
}

4.字符串相乘

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

解法:模拟

java 复制代码
class Solution {
    public String multiply(String num1, String num2){
        //1.优先处理前导零
        if ((num1.length()==1&&num1.charAt(0)=='0')||(num2.length()==1&&num2.charAt(0)=='0')){
            return "0";
        }
        //2.进行无进位相加
        char[] n1=new StringBuilder(num1).reverse().toString().toCharArray();
        char[] n2=new StringBuilder(num2).reverse().toString().toCharArray();
        int len1=n1.length;
        int len2=n2.length;
        int[] temp=new int[len1+len2-1];
        for (int i = 0; i < len1; i++) {
            int v1=n1[i]-'0';
            for (int j = 0; j < len2; j++) {
                int v2=n2[j]-'0';
                temp[i+j]+=v1*v2;
            }
        }
        //3.处理进位
        StringBuilder stringBuilder=new StringBuilder();
        int t=0; //表示进位
        for (int i = 0; i < temp.length; i++) {
            t+=temp[i];
            stringBuilder.append(t%10);
            t/=10;
        }
        //4.处理特殊情况
        if (t!=0){
            stringBuilder.append(t);
        }
        return stringBuilder.reverse().toString();
    }

}
相关推荐
多喝开水少熬夜1 小时前
dfs思路回溯
算法·深度优先·dfs
_F_y2 小时前
仿RabbitMQ实现消息队列-客户端模块实现
c++·算法·rabbitmq
一只小小的芙厨2 小时前
KMP总结
算法
生成论实验室2 小时前
《事件关系阴阳博弈动力学:识势应势之道》第十一篇:双脑协同——WOLM与大模型的共生智能
人工智能·算法·语言模型·架构·创业创新
上弦月-编程3 小时前
高效编程利器:转移表技术解析
c语言·开发语言·数据结构·算法·排序算法
薇茗3 小时前
【初阶数据结构】 左右逢源的分支诗律 二叉树2
c语言·数据结构·算法·二叉树
AZaLEan__3 小时前
算法考核题解
算法
MediaTea3 小时前
AI 术语通俗词典:ID3 算法
人工智能·算法
Morwit3 小时前
【力扣hot100】 221. 最大正方形
前端·算法·leetcode