首页 > 编程语言 >算法专题:字符串

算法专题:字符串

时间:2024-11-09 08:48:08浏览次数:6  
标签:专题 String int 算法 ret length 字符串 charAt

目录

1. 最长公共前缀

1.1 算法原理

1.2 算法代码

2. 最长回文子串

2.1 算法原理

2.2 算法代码

3. 二进制求和

3.1 算法原理

 3.2 算法代码

4. 字符串相乘

4.1 算法原理 

4.2 算法代码


1. 最长公共前缀

. - 力扣(LeetCode)

1.1 算法原理

有以下两种策略:

  1. 两两进行比较
  2. 统一进行比较

这里需要注意比较的结束条件:

  1. 当对任一字符串访问出现越界时, 应进行返回
  2. 当两个字符串相同位置上的元素不相同时, 应进行返回.

1.2 算法代码

class Solution {
    /**
     * 两两比较
     * @param strs
     * @return
     */
    public String longestCommonPrefix(String[] strs) {
        String ret = strs[0];
        for(int i = 1; i < strs.length; i++) {
            ret = findSame(ret, strs[i]);
        }
        return ret;
    }
    public String findSame(String s1, String s2) {
        String ret = "";
        int i = 0;
        while(i < Math.min(s1.length(), s2.length()) && s1.charAt(i) == s2.charAt(i))
            i++;
        return s1.substring(0, i);
    }

    /**
     * 统一比较
     * @param strs
     * @return
     */
    public String longestCommonPrefix1(String[] strs) {
        StringBuilder ret = new StringBuilder();
        for(int i = 0; i < strs[0].length(); i++) {
            char ch = strs[0].charAt(i);
            for(String str : strs) {
                if(i >= str.length()) return ret.toString();
                if(str.charAt(i) != ch) return ret.toString();
            }
            ret.append(ch);
        }
        return ret.toString();
    }
}

2. 最长回文子串

. - 力扣(LeetCode)

2.1 算法原理

本题有动态规划和中心扩展算法两个解法, 动态规划的解法已经在动态规划的专题上展示了, 这里使用中心扩展算法:

  1. 固定一个中心点
  2. 从中心点开始, 向两边扩展(注意: 子串长度为奇数和偶数的情况都要考虑)

2.2 算法代码

class Solution {
    public String longestPalindrome(String s) {
        int n = s.length();
        String ret = "";
        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++;
            }
            String str = s.substring(left + 1, right);
            ret = ret.length() >= str.length() ? ret : str;
            // 偶数子串
            left = i; right = i + 1;
            while(left >= 0 && right < n && s.charAt(left) == s.charAt(right)) {
                left--;
                right++;
            }
            str = s.substring(left + 1, right);
            ret = ret.length() >= str.length() ? ret : str;
        }
        return ret;
    }
}

3. 二进制求和

. - 力扣(LeetCode)

3.1 算法原理

本题本质上是一到模拟题, 模拟高精度加法. 高精度, 就是指 数非常的大, 数据的长度非常的长.

  1. 关键点在于遍历两个字符串
  2. 使用 tmp 记录两个字符串相同的位置相加后的值
  3. tmp % 2 => 结果值(二进制)
  4. tmp / 2 => 相加所得的进位

 3.2 算法代码

class Solution {
    public String addBinary(String a, String b) {
        // 模拟高精度加法
        int cur1 = a.length() - 1;
        int cur2 = b.length() - 1;
        int tmp = 0;
        StringBuilder sb = new StringBuilder();
        while(cur1 >= 0 || cur2 >= 0 || tmp != 0) {
            if(cur1 >= 0) tmp += a.charAt(cur1--) - '0';
            if(cur2 >= 0) tmp += b.charAt(cur2--) - '0';
            sb.append(tmp % 2);
            tmp /= 2;
        }
        return sb.reverse().toString();
    }
}

4. 字符串相乘

. - 力扣(LeetCode)

4.1 算法原理 

解法: 无进位相乘再相加, 最后处理进位

  1. 逆序字符串
  2. 无进位相乘再相加(将得到的结果使用数组存起来, 放到 i+j 位置处)
  3. 处理进位
  4. 处理前导零

4.2 算法代码

class Solution {
    public String multiply(String num1, String num2) {
        // 解法: 无进位相乘再相加, 最后处理进位

        // 预处理
        int m = num1.length(), n = num2.length();
        int[] arr = new int[m + n - 1];
        StringBuilder s1 = new StringBuilder(num1);
        StringBuilder s2 = new StringBuilder(num2);
        s1.reverse();
        s2.reverse();
        // 无进位相乘再相加
        for(int i = 0; i < m; i++) 
            for(int j = 0; j < n; j++) 
                arr[i + j] += (s1.charAt(i) - '0') * (s2.charAt(j) - '0');
        StringBuilder ret = new StringBuilder();
        int t = 0;
        int i = 0;
        // 处理进位
        while(i < arr.length || t != 0) {
            if(i < arr.length) t += arr[i++];
            ret.append(t % 10);
            t /= 10;
        }
        // 处理前导零
        ret.reverse();
        while(ret.charAt(0) == '0' && ret.length() > 1) ret.deleteCharAt(0);
        return ret.toString();
    }
}

END

标签:专题,String,int,算法,ret,length,字符串,charAt
From: https://blog.csdn.net/2401_83595513/article/details/143410711

相关文章

  • 字符串类
    字符串类:构造string对象和初始化#include<iostream>#include<string>usingnamespacestd;intmain(){ strings;//空串 strings1="hello,hhh";//初始化为hello,hhh strings2("OK");//初始化为"OK" strings3(s1);//用s1初始化s3 strings4(4,'c&#......
  • 字符串类
    17.6字符串类字符串类string是不同于字符数组的字符串处理方式。使用字符串类,需要包含以下头文件:#include<string>在学习过程中,必须分清楚string类和字符数组处理字符串的异同。17.6.1字符串类:输入输出(cin/cout)可以使用cin和cout来读写string类型。使用cin读入string类型,会忽略......
  • 深入解析 Transformers 框架(四):Qwen2.5/GPT 分词流程与 BPE 分词算法技术细节详解
    前面我们已经通过三篇文章,详细介绍了Qwen2.5大语言模型在Transformers框架中的技术细节,包括包和对象加载、模型初始化和分词器技术细节:深入解析Transformers框架(一):包和对象加载中的设计巧思与实用技巧深入解析Transformers框架(二):AutoModel初始化及Qwen2.5模型加载全......
  • byte数组转16进制,二进制字符串
    1)16进制字符串a)c#内置apibyte[]bytes=BitConverter.GetBytes(123);varhexStr=BitConverter.ToString(bytes); b)实现1///返回低字节顺序十六进制字符串(低字节在左侧)publicstaticstringToHexString(byte[]bytes){char[]hexChars="012345678......
  • 代码随想录算法训练营第十六天| 找树左下角的值
    513.找树左下角的值文章链接:https://programmercarl.com/0513.找树左下角的值.html题目链接:https://leetcode.cn/problems/find-bottom-left-tree-value/description/要点:不管是前中后序遍历,左节点总是先比右节点先遍历,所以只要找到深度最大的叶子节点,即找到最左下角的值cla......
  • 自动泊车端到端算法 ParkingE2E 介绍
    01算法介绍自主泊车是智能驾驶领域中的一项关键任务。传统的泊车算法通常使用基于规则的方案来实现。因为算法设计复杂,这些方法在复杂泊车场景中的有效性较低。相比之下,基于神经网络的方法往往比基于规则的方法更加直观和多功能。通过收集大量专家泊车轨迹数据,基于学习的仿人策......
  • 看一遍就会用——面向对象:类和对象,实例属性,实例方法,字符串表示
    python面向对象1.类和对象2.实例属性3.实例方法4.字符串表示1.__str__方法2.__repr__方法1.类和对象在Python中,类和对象是面向对象编程(OOP)的核心概念。类(Class)是创建对象的蓝图或模板,它定义了对象将拥有的属性和方法。对象(Object)则是根据类创建的具体实例,它包含了类......
  • 详解:字符串常量池
            字符串常量池是Java运行时环境(JRE)的一部分,它用于存储字符串字面量。字符串字面量是源代码中直接用双引号括起来的字符串,例如"hello"。在Java中,字符串是不可变的,这意味着一旦创建了一个字符串对象,它的值就不能改变。        当Java编译器遇到字符串字......
  • 前端入门一之JS对象、字符串对象、数组对象、Data()对象等
    前言JS是前端三件套之一,也是核心,本人将会更新JS基础、JS对象、DOM、BOM、ES6等知识点,这篇是JS常用的内置对象;这篇文章是本人大一学习前端的笔记;欢迎点赞+收藏+关注,本人将会持续更新。文章目录目录总览1、对象1.1、创建对象(object)利用字面量创建对象对象的调用变量......
  • 代码随想录算法训练营day39 day40| 198.打家劫舍 213.打家劫舍II 337.打家劫舍III
    学习资料:https://programmercarl.com/0198.打家劫舍.html#算法公开课动态规划的打家劫舍系列和股票买卖系列(股票还有贪心算法可解)学习记录:198.打家劫舍(一维dp数组,前n间房子都可偷的情况下的最高金额,每间房子偷数都是由前一间和前两间决定)点击查看代码classSolution(object)......