【字符串】最长公共前缀 最长回文子串

news/2025/2/27 10:57:50

文章目录

  • 14. 最长公共前缀
  • 解题思路:模拟
  • 5. 最长回文子串
  • 解题思路一:动态规划
  • 解题思路二:中心扩散法

在这里插入图片描述

14. 最长公共前缀

14. 最长公共前缀

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成

解题思路:模拟

​ 这道题模拟的思路有两种,第一种就是每次比较每个字符串同一位置的字符,判断是否相等,如果不相等则返回前面匹配的位置,可以使用 substr() 函数直接实现这块!

​ 另一种思路就是两两字符串进行比较,得到一个最长公共前缀之后,将其与第三个字符串比较,以此类推直到比较了所有字符串之后,得到的结果就是最长的公共前缀了!

​ 两种思路的时间复杂度都是 O(n*m),其中 n 表示的是字符串的个数,m 表示字符串平均字符个数,下面代码我们采用的是第一种思路!

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        // 每次比较每个字符串同一位置的字符
        for(int i = 0; i < strs[0].size(); ++i)
        {
            char tmp = strs[0][i];
            for(int j = 1; j < strs.size(); ++j)
            {
                // 如果某个字符串越界了,或者字符不相等,则直接返回前面匹配的位置
                if((i == strs[j].size()) || (strs[j][i] != tmp))
                    return strs[0].substr(0, i);
            }
        }
        return strs[0];
    }
};

5. 最长回文子串

5. 最长回文子串

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

​ 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串

示例 1:

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

示例 2:

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

提示:

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

解题思路一:动态规划

​ 这道题的动态规划解法之前在学动态规划的时候就已经讲过了,这里就不再赘述了,具体可以参考之前的笔记!

class Solution {
public:
    string longestPalindrome(string s) {
        // 定义dp二维数组,dp[j][i]表示从[j, i]区间是否为回文字符串
        bool dp[1000][1000] = { 0 };

        int maxlen = 0, maxindex = 0;
        for(int i = 0; i < s.size(); ++i)
        {
            for(int j = 0; j <= i; ++j)
            {
                // 状态转移方程
                if(s[i] == s[j])
                {
                    if(i == j || j + 1 == i)
                        dp[j][i] = true;
                    else
                        dp[j][i] = dp[j + 1][i - 1];
                    
                    if(dp[j][i] && i - j + 1 > maxlen) // 是回文字符串并且长度更长了再更新
                    {
                        maxlen = i - j + 1;
                        maxindex = j;
                    }
                }
            }
        }
        return s.substr(maxindex, maxlen);
    }
};

解题思路二:中心扩散法

​ 之前我们在动态规划笔记中提到,字符串的常见题解方法还有一个中心扩散法(至于一个马拉车算法就不讲了,学习成本高,使用率太低),它其实借助的就是回文字符串的特性,由中心自发的向外扩散寻找回文字符串,直到不符合要求!

​ 假设此时我们遍历到字符串i 位置,然后定义两个指针 leftright 指向该位置,两指针从该位置分别向左和向右出发,每次走一格,判断 s[left] 是否等于 s[right],是的话说明此时就是 [left, right] 区间就是一个回文字符串,则判断是否需要更新最大长度以及回文字符串的起始位置,一直重复上述动作直到判断不符合或者越界了为止!

​ 但是上面操作有个问题,就是只考虑到了区间是奇数的情况,如果是偶数情况比如字符串 "abbc" 的话,此时 "bb" 这种情况就被忽略了,所以我们 需要判断偶数个字符的情况

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();
        int maxlen = 0, maxindex = 0;
        for(int i = 0; i < n; ++i)
        {
            // 判断奇数情况
            int left = i, right = i;
            while(left >= 0 && right < n && s[left] == s[right])
            {
                left--;
                right++;
            }
            if(right - left - 1 > maxlen)
            {
                maxlen = right - left - 1;
                maxindex = left + 1;
            }

            // 判断偶数情况(就起始位置不一样,剩下的操作逻辑都是一样的)
            left = i, right = i + 1;
            while(left >= 0 && right < n && s[left] == s[right])
            {
                left--;
                right++;
            }
            if(right - left - 1 > maxlen)
            {
                maxlen = right - left - 1;
                maxindex = left + 1;
            }
        }
        return s.substr(maxindex, maxlen);
    }
};

在这里插入图片描述


http://www.niftyadmin.cn/n/5869998.html

相关文章

【生成模型】【ComfyUI(三)】使用WebAPI批量调用ComfyUI

可以参考【生成模型】【ComfyUI&#xff08;一&#xff09;】Flux与Flux-Fill部署与API调用中Flux-Fill部分 1. 调整Workflow 我们要部署以下workflow 做两个修改 输入改为从Load Image(Base64) 读入图片&#xff0c;当然使用上面的从路径中读图也是可以的输出改为SaveImag…

深入理解 Spring 中的 `ThreadPoolTaskExecutor` 与 `ThreadPoolExecutor`

在 Spring 框架中&#xff0c;线程池是处理并发任务的核心工具之一。特别是在异步任务的执行中&#xff0c;Spring 提供了 Async 注解来方便地将方法执行移交给线程池。虽然 ThreadPoolExecutor 是 Java 标准库中提供的线程池实现&#xff0c;但 Spring 提供了一个更加符合其生…

Arcgis 实用制图技巧--如何制作“阴影”效果

今天给大家介绍arcgis中阴影效果的制作方法,操作很简单,在ArcMap当中使用制图表达和移动几何方式就可以轻松实现。 左侧地图的图形背景组织很差。右侧地图通过使用阴影效果突出了重点内容。今天,我将要介绍两种阴影效果的创建方法:第一,纯色阴影(single color);第二,渐变…

配置 tabBar 效果

1 创建 tabBar 分支 运行如下的命令&#xff0c;基于 master 分支在本地创建 tabBar 子分支&#xff0c;用来开发和 tabBar 相关的功能&#xff1a; git checkout -b tabbar 2 创建 tabBar 页面 在 pages 目录中&#xff0c;创建首页 (home) 、分类 (cate) 、购物车…

C++ 根据二叉树创建字符串 - 力扣(LeetCode)

点击链接即可查看题目: 606. 根据二叉树创建字符串 - 力扣&#xff08;LeetCode&#xff09; 一、题目 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空…

(九)axios的使用

1、axios 的基本使用 1.1、简介 在 Web 开发的演进历程中&#xff0c;数据请求方式的变革至关重要。回溯早期&#xff0c;旧浏览器在向服务器请求数据时&#xff0c;存在严重弊端。由于返回的是整个页面数据&#xff0c;每次请求都会导致页面强制刷新&#xff0c;这不仅极大地…

VidSketch:具有扩散控制的手绘草图驱动视频生成

浙大提出的VidSketch是第一个能够仅通过任意数量的手绘草图和简单的文本提示来生成高质量视频动画的应用程序。该方法训练是在单个 RTX4090 GPU 上进行的&#xff0c;针对每个动作类别使用一个小型、高质量的数据集。VidSketch方法使所有用户都能使用简洁的文本提示和直观的手绘…

0x01 html和css

css 对于三种css使用方式&#xff1a; 第一种&#xff1a;行内样式 <span style"color: grey;">2024年05月15日 20:07</span>第二种&#xff1a;内部样式 <!DOCTYPE html> <html lang"en"> <head>...<style>span{…