算法奇妙屋(七)-字符串操作

文章目录

  • [一. 力扣 14. 最长公共前缀](#一. 力扣 14. 最长公共前缀)
    • [1. 题目](#1. 题目)
    • [2. 算法原理](#2. 算法原理)
      • [(1) 算法一:](#(1) 算法一:)
      • [(2) 方法二:](#(2) 方法二:)
    • [3. 代码](#3. 代码)
      • [(1) 方法一代码:](#(1) 方法一代码:)
      • [(2) 方法二代码:](#(2) 方法二代码:)
  • [二. 力扣 5. 最长回文子串](#二. 力扣 5. 最长回文子串)
    • [1. 题目](#1. 题目)
    • [2. 算法原理](#2. 算法原理)
    • [3. 代码](#3. 代码)
  • [三. 力扣 67. 二进制求和](#三. 力扣 67. 二进制求和)
    • [1. 题目](#1. 题目)
    • [2. 算法原理](#2. 算法原理)
    • [3. 代码](#3. 代码)
  • [四. 力扣](#四. 力扣)
    • [1. 题目](#1. 题目)
    • [2. 算法原理](#2. 算法原理)
    • [3. 代码](#3. 代码)



一. 力扣 14. 最长公共前缀

1. 题目

2. 算法原理

(1) 算法一:

(2) 方法二:

3. 代码

(1) 方法一代码:

java 复制代码
    public String longestCommonPrefix(String[] strs) {
        StringBuilder ret = new StringBuilder();
        ret.append(strs[0]);
        int j = 0;
        for (int i = 1; i < strs.length; i++) {
            j = 0;
            while (j < ret.length() && j < strs[i].length()) {
                if (ret.charAt(j) == strs[i].charAt(j)) {
                    if (j >= ret.length()) {
                        ret.append(strs[i].charAt(j));
                    }
                }else {
                    break;
                }
                j++;
            }
            if (j < ret.length()) {
                ret.delete(j, ret.length()); // 删除多余不相同的字符
            }
        }
        return ret.toString();
    }

(2) 方法二代码:

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

二. 力扣 5. 最长回文子串

1. 题目

2. 算法原理

3. 代码

java 复制代码
    public String longestPalindrome(String s) {
        int len = 0;
        int start = 0;
        int left = 0;
        int right = 0;
        for (int i = 0; i < s.length(); i++) {
            left = i - 1;
            right = i + 1;
            while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
                left--;
                right++;
            }
            if ((right - left - 1) > len) {
                len = right - left - 1;
                start = left + 1;
            }
            left = i;
            right = i + 1;
            while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
                left--;
                right++;
            }
            if ((right - left - 1) > len) {
                len = right - left - 1;
                start = left + 1;
            }
        }
        return s.substring(start,start + len);
    }

三. 力扣 67. 二进制求和

1. 题目

2. 算法原理

3. 代码

java 复制代码
    public String addBinary(String a, String b) {
        int cur1 = a.length() - 1;
        int cur2 = b.length() - 1;
        char[] ch1 = a.toCharArray();
        char[] ch2 = b.toCharArray();
        int tmp = 0;
        StringBuilder ret = new StringBuilder();
        while(cur1 >= 0 || cur2 >= 0 || tmp != 0) {
            if (cur1 >= 0) {
                tmp += a.charAt(cur1) - '0';
                cur1--;
            }
            if (cur2 >= 0) {
                tmp += b.charAt(cur2) - '0';
                cur2--;
            }
            ret.append(tmp % 2);
            tmp /= 2;
        }
        ret.reverse();
        return ret.toString();
    }

四. 力扣

1. 题目

2. 算法原理

1.大概逻辑,下面是细节讲解

2.为什么tmp长度一定是两个字符串长度和-1

3.无进位相乘再相加的模拟过程

3. 代码

java 复制代码
    public String multiply(String num1, String num2) {
        StringBuilder ss1 = new StringBuilder(num1);
        ss1.reverse();
        String s1 = ss1.toString();
        StringBuilder ss2 = new StringBuilder(num2);
        ss2.reverse();
        String s2 = ss2.toString();
        if (s1.equals("0") || s2.equals("0")) {
            return "0";
        }
        int m = num1.length();
        int n = num2.length();
        int[] tmp = new int[m + n - 1];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                tmp[i + j] += ((s1.charAt(i) - '0') * (s2.charAt(j) - '0'));
            }
        }
        int t = 0;
        int i = 0;
        StringBuilder ret = new StringBuilder();
        while (i < tmp.length || t != 0) {
            if (i < m + n - 1) {
                t += tmp[i];  
            }
            ret.append(t % 10);
            t /= 10;
            i++;
        }
        ret.reverse();
        return ret.toString();
    }
相关推荐
庞轩px4 小时前
第8篇:原子类与CAS底层原理——无锁并发的实现
java·cas·乐观锁·aba·无锁编程·自旋
智者知已应修善业5 小时前
【51单片机不用数组动态数码管显示字符和LED流水灯】2023-10-3
c++·经验分享·笔记·算法·51单片机
rleS IONS5 小时前
SpringBoot中自定义Starter
java·spring boot·后端
DevilSeagull5 小时前
MySQL(2) 客户端工具和建库
开发语言·数据库·后端·mysql·服务
苍煜5 小时前
慢SQL优化实战教学
java·数据库·sql
MATLAB代码顾问5 小时前
改进遗传算法(IGA)求解作业车间调度问题(JSSP)——附MATLAB代码
开发语言·matlab
AI进化营-智能译站5 小时前
ROS2 C++开发系列16-智能指针管理传感器句柄|告别ROS2节点内存泄漏与野指针
java·c++·算法·ai
syker6 小时前
AIFerric深度学习框架:自研全栈AI基础设施的技术全景
开发语言·c++
HSunR6 小时前
dify 搭建ai作业批改流
开发语言·前端·javascript
CS创新实验室6 小时前
从盘边到芯端——硬盘接口七十年变迁史
算法·磁盘调度