常见字符串相关题目

找往期文章包括但不限于本期文章中不懂的知识点:

个人主页:我要学编程(ಥ_ಥ)-CSDN博客

所属专栏: 优选算法专题

目录

14.最长公共前缀

5.最长回文子串

67.二进制求和

43.字符串相乘


14.最长公共前缀

题目:

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

示例 1:

输入:strs = ["flower","flow","flight"]
输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 如果非空,则仅由小写英文字母组成

思路:我们有两种方式来查找字符串的最长公共长缀。一种方式是:两两比较,先查找两个字符串的最长公共前缀,得到的结果再去比较后面的字符串,一直比较直至最终遍历完数组即可。另外一种方式是:统一比较,以第一个字符串为基准字符串,从第一个字符字母开始与后续数组元素进行比较,如果遇到了字符串的末尾或者字符串的字母不相等,就可以直接返回最终的结果了。

代码实现:

两两比较的方式:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        // 两两比较:比较两个字符串,得到最长公共前缀
        String ret = strs[0];
        for (int i = 1; i < strs.length; i++) {
            String s = strs[i];
            int j = 0;
            // 满足两者都不越界的情况
            while (j < ret.length() && j < s.length()) {
                if (ret.charAt(j) != s.charAt(j)) { // 不相等直接返回即可
                    break;
                }
                j++;
            }
            // 更新最长公共前缀
            ret = ret.substring(0, j);
        }
        return ret;
    }
}

统一比较的方式:

class Solution {
    public String longestCommonPrefix(String[] strs) {
        // 统一比较:比较全部字符串的每个字符
        String ret = strs[0];
        for (int i = 0; i < ret.length(); i++) {
            char ch = ret.charAt(i);
            // 依次比较后面的元素相同位置是否是相同的字符
            for (int j = 1; j < strs.length; j++) {
                // 如果到达字符串的末尾了 或者 字符串的字符不相等了,直接返回即可
                if (i == strs[j].length() || ch != strs[j].charAt(i)) {
                    return ret.substring(0, i);
                }
            }
        }
        return strs[0]; // 说明所有的元素都是相同的
    }
}

5.最长回文子串

题目:

给你一个字符串 s,找到 s 中最长的 回文 子串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

思路:有一个专门寻找回文子串相关的算法:中心扩展算法。因为回文子串的特点是从左到右遍历得到的序列与从右到左得到的序列是一样的,那么从回文子串的中间位置往两边扩展的结果也是一致的。利用这个性质,我们就可以来做题了:遍历字符串,在每一个位置进行中心扩展算法,得到回文子串的序列,最后返回最长的回文子串序列即可。

代码实现:

class Solution {
    public String longestPalindrome(String ss) {
        char[] s = ss.toCharArray();
        int n = s.length;
        int begin = 0, end = 0;
        // 固定一个中心点
        for (int i = 0; i < n; i++) {
            // 从中心点开始往两侧扩展
            // 先扩展奇数个
            int left = i, right = i;
            while (left >= 0 && right <= n-1 && s[left] == s[right]) {
                left--;
                right++;
            }
            // 更新begin 与 end
            if (right-left-1 > end-begin+1) {
                begin = left+1;
                end = right-1;
            }
            // 再扩展偶数个
            left = i;
            right = i+1;
            while (left >= 0 && right <= n-1 && s[left] == s[right]) {
                left--;
                right++;
            }
            //更新begin 与 end
            if (right-left-1 > end-begin+1) {
                begin = left+1;
                end = right-1;
            }
        }
        return ss.substring(begin, end+1);
    }
}

要注意的是在扩展的过程中,字符个数可能是奇数个,也可能是偶数个,因此我们扩展时也得分情况讨论。 

67.二进制求和

题目:

给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。

示例 1:

输入:a = "11", b = "1"
输出:"100"

示例 2:

输入:a = "1010", b = "1011"
输出:"10101"

提示:

  • 1 <= a.length, b.length <= 104
  • a 和 b 仅由字符 '0' 或 '1' 组成
  • 字符串如果不是 "0" ,就不含前导零

思路:遍历字符串,拿到两者相加的和,模上进位数作为当前位的结果,当两个字符串遍历完成且进位为0时,就可以返回最终结果了。

代码实现:

class Solution {
    public String addBinary(String a, String b) {
        // 遍历字符串模拟列竖式运算
        int ai = a.length()-1, bi = b.length()-1, t = 0;
        StringBuilder sb = new StringBuilder();
        // 注意:题目给的是正序序列,但是计算时需要从后面(低位)开始计算
        while (ai >= 0 || bi >= 0) {
            // 先计算两者相同位相加的结果
            if (ai >= 0) {
                // t += a.charAt(ai); // 这里拿到的是字符1,而不是数字1
                t += a.charAt(ai) - '0';
            }
            if (bi >= 0) {
                // t += b.charAt(bi); // 这里拿到的是字符1,而不是数字1
                t += b.charAt(bi) - '0';
            }
            sb.append(t % 2);
            t /= 2;
            ai--;
            bi--;
        }
        // 可能最终的进位并不为0
        if (t != 0) {
            sb.append(t % 2);
        }
        // 注意:最终的结果要逆序
        return sb.reverse().toString();
    }
}

43.字符串相乘

题目:

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

提示:

  • 1 <= num1.length, num2.length <= 200
  • num1 和 num2 只能由数字组成。
  • num1 和 num2 都不包含任何前导零,除了数字0本身。

思路:与上一题的二进制求和类似。也是采用模拟计算的方式来写,这里是模拟乘法的方式,即列竖式运算。如下所示:

遍历其中一个字符串,使其的每一个字符去乘以另外一个字符串,得到的结果进行相加求和,就是最终的结果。这里的求和就是上面二进制求和的写法。

上面这种暴力模拟是非常麻烦的,代码也是非常多的。还有一种是对乘法的简化:先是无进位相乘,再对结果进行相加,最后转换为正常位数的表示即可。

代码实现:

模拟列竖式运算:

class Solution {
    // 对两个字符串数字进行相乘,返回字符串形式的积
    public String multiply(String num1, String num2) {
        // 判断字符串是否存在0
        if ("0".equals(num1) || "0".equals(num2)) {
            return "0";
        }
        String ret = "";
        // 模拟列竖式计算
        int count = 0; // 统计先导0
        for (int i = num2.length()-1; i >= 0; i--) {
            StringBuilder temp = new StringBuilder();
            // 计算先导0
            for (int j = 0; j < count; j++) {
                temp.append(0);
            }
            count++;
            // 计算 num2的每一个位 与 num1 的乘积
            int product = 0; // 存储乘积
            int a = num2.charAt(i) - '0';
            for (int j = num1.length()-1; j >= 0; j--) {
                int b = num1.charAt(j) - '0';
                product = a * b + product; // 原始乘积+进位
                temp.append(product % 10);
                product /= 10;
            }
            // 进位可能不为0
            if (product != 0) {
                temp.append(product % 10);
            }
            // 将乘积进行相加("两数"之和)
            ret = twoNumSum(ret, temp.reverse().toString());
        }
        return ret;
    }


    // 对两个字符串数字进行相加,返回字符串形式的和
    public String twoNumSum(String s1, String s2) {
        int i = s1.length()-1, j = s2.length()-1;
        int sum = 0;
        StringBuilder builder = new StringBuilder();
        while (i >= 0 || j >= 0) {
            if (i >= 0) {
                sum += s1.charAt(i) - '0';
            }
            if (j >= 0) {
                sum += s2.charAt(j) - '0';
            }
            builder.append(sum % 10);
            sum /= 10;
            i--;
            j--;
        }
        // 可能存在进位
        if (sum != 0) {
            builder.append(sum % 10);
        }
        // 需要逆置
        return builder.reverse().toString();
    }
}

模拟列竖式优化版:

class Solution {
    // 对两个字符串数字进行相乘,返回字符串形式的积
    public String multiply(String num1, String num2) {
        // 判断字符串是否存在0
        if ("0".equals(num1) || "0".equals(num2)) {
            return "0";
        }
        // 先逆序字符串
        String s1 = new StringBuilder(num1).reverse().toString();
        String s2 = new StringBuilder(num2).reverse().toString();
        int n1 = s1.length(), n2 = s2.length();
        // 申请一个数组存放乘积
        int[] temp = new int[n1+n2-1];
        // 计算 num2的每一个位 与 num1 的乘积
        for (int i = 0; i < n2; i++) {
            int a = s2.charAt(i) - '0';
            for (int j = 0; j < n1; j++) {
                int b = s1.charAt(j) - '0';
                temp[i+j] +=  a*b; // 一定要加上原来的值
            }
        }
        // 将数组的每一位转换成标准表示形式("两数"相加的思路)
        int i = 0;
        StringBuilder builder = new StringBuilder();
        int sum = 0;
        while (i < n1+n2-1) {
            sum += temp[i];
            builder.append(sum % 10);
            sum /= 10;
            i++;
        }
        // 可能存在进位不为0的情况
        if (sum != 0) {
            builder.append(sum % 10);
        }
        // 注意要逆置
        return builder.reverse().toString();
    }
}

好啦!本期 常见字符串相关题目 的刷题之旅 就到此结束啦!我们下一期再一起学习吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/961042.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek:突破传统的AI算法与下载排行分析

DeepSeek的AI算法突破DeepSeek相较于OpenAI以及其它平台的性能对比DeepSeek的下载排行分析&#xff08;截止2025/1/28 AI人工智能相关DeepSeek甚至一度被推上了搜索&#xff09;未来发展趋势总结 在人工智能技术飞速发展的当下&#xff0c;搜索引擎市场也迎来了新的变革。DeepS…

2025神奇的数字—新年快乐

2025年&#xff0c;一个神奇的数字&#xff0c;承载着数学的奥秘与无限可能。它是45的平方&#xff08;45&#xff09;&#xff0c;上一个这样的年份是1936年&#xff08;44&#xff09;&#xff0c;下一个则是2116年&#xff08;46&#xff09;&#xff0c;一生仅此一次。2025…

搭建Spark分布式集群

1&#xff0c;下载 下载 spark-3.5.4-bin-without-hadoop.tgz 地址&#xff1a; https://downloads.apache.org/spark/spark-3.5.4/ 2&#xff0c;安装 通过虚拟机设置共享文件夹将需要的安装包复制到linux虚拟机中 localhost1。虚拟机的共享盘在 /mnt/hgfs/。 将共享盘安装…

2025春晚刘谦魔术揭秘魔术过程

2025春晚刘谦魔术揭秘魔术过程 首先来看全过程 将杯子&#xff0c;筷子&#xff0c;勺子以任意顺序摆成一排 1.筷子和左边物体交换位置 2.杯子和右边物体交换位置 3.勺子和左边物体交换位置 最终魔术的结果是右手出现了杯子 这个就是一个简单的分类讨论的问题。 今年的魔术…

通过高效的侦察发现关键漏洞接管整个IT基础设施

视频教程在我主页简介或专栏里 在这篇文章中&#xff0c; 我将深入探讨我是如何通过详细分析和利用暴露的端点、硬编码的凭据以及配置错误的访问控制&#xff0c;成功获取目标组织关键IT基础设施和云服务访问权限的全过程。 我们先提到目标网站的名称 https://*sub.domain*.co…

Java实战项目-基于 springboot 的校园选课小程序(附源码,部署,文档)

Java 基于 springboot 的校园选课小程序 博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&…

计算机视觉-卷积

卷积-图像去噪 一、图像 二进制 灰度 彩色 1.1二进制图像 0 1 一个点可以用一个bit&#xff08;0/1&#xff09;来表示 1.2灰度图像 0-255 一个点可以用一个byte来表示 1.3彩色图像 RGB 表达一个彩色图像先说它的分辨率p/w&#xff08;宽&#xff09;和q/h&#xff08;高…

【论文笔记】Fast3R:前向并行muti-view重建方法

众所周知&#xff0c;DUSt3R只适合做稀疏视角重建&#xff0c;与sapnn3r的目的类似&#xff0c;这篇文章以并行的方法&#xff0c;扩展了DUSt3R在多视图重建中的能力。 abstract 多视角三维重建仍然是计算机视觉领域的核心挑战&#xff0c;尤其是在需要跨不同视角实现精确且可…

基于SpringBoot的高校一体化服务平台的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

单片机基础模块学习——AT24C02芯片

一、EEPROM芯片 ROMRAM断电后数据保留断电后数据消失 因此&#xff0c;如果在断电后希望数据继续保留的话&#xff0c;就需要存储在EEPROM芯片中。 二、EEPROM芯片原理图 A0~A2与芯片地址相关连接到GND&#xff0c;为0GND 接地&#xff0c;VCC 正电源 WP——write protect写…

VSCode+Continue实现AI辅助编程

Continue是一款功能强大的AI辅助编程插件&#xff0c;可连接多种大模型&#xff0c;支持代码设计优化、错误修正、自动补全、注释编写等功能&#xff0c;助力开发人员提高工作效率与代码质量。以下是其安装和使用方法&#xff1a; 一、安装VSCode 参见&#xff1a; vscode安…

开源先锋DeepSeek-V3 LLM 大语言模型本地调用,打造自己专属 AI 助手

DeepSeek-V3是一个强大的混合专家 (MoE) 语言模型&#xff0c;总共有 671B 个参数。为了实现高效的推理和经济高效的训练&#xff0c;DeepSeek-V3 采用了多头潜在注意力机制 (MLA) 和 DeepSeekMoE 架构&#xff0c;这些架构在 DeepSeek-V2 中得到了彻底的验证。此外&#xff0c…

在Windows系统中本地部署属于自己的大语言模型(Ollama + open-webui + deepseek-r1)

文章目录 1 在Windows系统中安装Ollama&#xff0c;并成功启动&#xff1b;2 非docker方式安装open-webui3下载并部署模型deepseek-r1 Ollama Ollama 是一个命令行工具&#xff0c;用于管理和运行机器学习模型。它简化了模型的下载与部署&#xff0c;支持跨平台使用&#xff0c…

【问题】Chrome安装不受支持的扩展 解决方案

此扩展程序已停用&#xff0c;因为它已不再受支持 Chromium 建议您移除它。详细了解受支持的扩展程序 此扩展程序已停用&#xff0c;因为它已不再受支持 详情移除 解决 1. 解压扩展 2.打开manifest.json 3.修改版本 将 manifest_version 改为3及以上 {"manifest_ver…

RoboVLM——通用机器人策略的VLA设计哲学:如何选择骨干网络、如何构建VLA架构、何时添加跨本体数据

前言 本博客内解读不少VLA模型了&#xff0c;包括π0等&#xff0c;且如此文的开头所说 前两天又重点看了下openvla&#xff0c;和cogact&#xff0c;发现 目前cogACT把openvla的动作预测换成了dit&#xff0c;在模型架构层面上&#xff0c;逼近了π0​那为了进一步逼近&#…

嵌入式知识点总结 Linux驱动 (三)-文件系统

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.什么是文件系统&#xff1f; 2.根文件系统为什么这么重要&#xff1f;​编辑 3.可执行映像文件通常由几部分构成&#xff0c;他们有什么特点&#xff1f; 1.什么是文件系统&a…

【AI大模型】提示词(Prompt)全面解析

文章目录 前言前置准备&#xff08;非常重要&#xff09;一、Prompt 提示词介绍1.1 Prompt 的重要性 二、Prompt 提示词元素构成与实践2.1 关键字2.2 上下文2.3 格式要求2.4 实践示例 三、Prompt 提示词编写原理3.1 清晰性3.2 具体性3.3 适应性 四、Prompt 提示词编写常用的分隔…

react native在windows环境搭建并使用脚手架新建工程

截止到2024-1-11&#xff0c;使用的主要软件的版本如下&#xff1a; 软件实体版本react-native0.77.0react18.3.1react-native-community/cli15.0.1Android Studio2022.3.1 Patch3Android SDKAndroid SDK Platform 34 35Android SDKAndroid SDK Tools 34 35Android SDKIntel x…

Linux环境基础开发工具的使用(apt, vim, gcc, g++, gbd, make/Makefile)

什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安 装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的…

[c语言日寄]越界访问:意外的死循环

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…