每天一道Rust-LeetCode(2019-06-04) 最长回文子串

坚持每天一道题,刷题学习Rust.

原题

题目描述

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"

输出: "bab"

注意: "aba" 也是一个有效答案。

示例 2:

输入: "cbbd"

输出: "bb"

解题过程

思路:

怎么把规模大的问题化成规模小的问题进行解决

假设用m[i][j]表示从i到j是回文的长度

那么只有两种情况可以扩展出回文

m[i][j]是回文,当且仅当:

  1. m[i][j-1]是回文,并且m[i][j-1]长度是1,并且m[j-1]==m[j]
  2. m[i+1][j-1]是回文,并且m[i]==m[j]

    遍历的过程中记一个最长字符串即可.

还有另外一种思路:

从中间向两边扩展

针对每个字符,不断向两边扩展以两种形式aa,a向外扩展

第一种思路是O(n^2)复杂度

第二种差不多也是O(n^2)复杂度,考虑到剪枝效果,会高几倍

但是根据别人提交

struct Solution {}
impl Solution {
pub fn longest_palindrome(s: String) -> String {
if s.len() <= 0 {
return s;
}
let ss = s.as_bytes();
let mut m = vec![vec![0; ss.len()]; ss.len()]; // for i in 0..m.len() {
// m[i] = Vec::with_capacity(s.len());
// }
for i in 0..m.len() {
m[i][i] = 1; //自身肯定是一个回文
}
let mut longest = &ss[0..1];
//step
for k in 1..s.len() {
//元素下标
for i in 0..s.len() {
if (i + k) < s.len() && m[i][i + k - 1] == 1 && ss[i + k - 1] == ss[i + k] {
m[i][i + k] = 2;
if longest.len() <= k {
longest = &ss[i..(i + k + 1)]; //包含最后一位
}
} else {
let s = i + 1;
let e = i + k - 1;
if i + 1 >= m.len() || i + k >= m.len() {
continue; //越界的不考虑
}
if m[i + 1][i + k - 1] > 0 && ss[i] == ss[i + k] {
m[i][i + k] = m[i + 1][i + k - 1] + 2; //向周边扩展了两位
if longest.len() <= k {
longest = &ss[i..(i + k + 1)]; //包含最后一位
}
}
}
}
}
String::from_utf8(Vec::from(longest)).ok().unwrap()
}
} #[cfg(test)]
mod test {
use super::*;
#[test]
fn test_longest_palindrome() {
assert_eq!(Solution::longest_palindrome(String::from("babad")), "bab");
assert_eq!(Solution::longest_palindrome(String::from("babba")), "abba");
assert_eq!(Solution::longest_palindrome(String::from("abcdef")), "a");
assert_eq!(Solution::longest_palindrome(String::from("")), "");
assert_eq!(Solution::longest_palindrome(String::from("abbcd")), "bb");
}
}

一点感悟

 `String::from_utf8(Vec::from(longest)).ok().unwrap() `字符串之间的转换还是不太熟悉,
基本工具使用不够熟练

其他

欢迎关注我的github,本项目文章所有代码都可以找到.

每天一道Rust-LeetCode(2019-06-04)的更多相关文章

  1. win10 下的anaconda3 安装(2019.06.04最新)

    最近电脑重装系统后,安装anaconda 发现有一些新的变动,容易出现一些新的问题,现在记录下来.(现在根据清华镜像的最新公告,清华anaconda 已经恢复,可以直接换成清华镜像的源了) 1 安装 ...

  2. http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html(重要)

    http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html

  3. BlackArch Linux 2019.06.01 宣布发布

    导读 BlackArch Linux是一个基于Arch Linux的发行版,专为渗透测试人员和安全研究人员设计,并包含大量渗透测试和安全实用程序,已宣布发布2019.06.01版本. BlackArc ...

  4. 【2019年04月10日】股票的滚动市盈率PE最低排名

    仅根据最新的市盈率计算公式进行排名,无法对未来的业绩做出预测. 新钢股份(SH600782) - 滚动市盈率PE:3.87 - 滚动市净率PB:1.29 - 滚动年化股息收益率:1.31% - 钢铁 ...

  5. 【2019年04月22日】A股最便宜的股票

      太钢不锈(SZ000825) - 当前便宜指数:170.67 - 滚动扣非市盈率PE:4.37 - 滚动市净率PB:0.98 - 动态年化股息收益率:4.79%- 太钢不锈(SZ000825)的历 ...

  6. 【2019年04月03日】A股最便宜的股票

    太钢不锈(SZ000825) - 当前便宜指数:161.66 - 滚动扣非市盈率PE:4.62 - 滚动市净率PB:1.03 - 动态年化股息收益率:4.53% - 太钢不锈(SZ000825)的历史 ...

  7. 2019.01.04 洛谷 P4721 【模板】分治 FFT

    传送门 如同题目所描述的一样,这是一道板题. 题意简述:给你一个数组g1,2,...ng_{1,2,...n}g1,2,...n​并定义f0=1,fi=∑j=1ifi−jgjf_0=1,f_i=\su ...

  8. 2019.06.17课件:[洛谷P1310]表达式的值 题解

    P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...

  9. [LeetCode]LCP 06. 拿硬币

    桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中.我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数. 示例 1: 输入:[4,2,1] 输出:4 解释:第一堆力扣 ...

  10. Google Maps 学习笔记(二)地图天气预报服务 2014.06.04

    地图天气预报服务:一,获取天气预报信息:二,解析天气预报信息:三,在地图上加载天气预报信息: Yahoo!提供的天气预报服务采用流行的RSS输出结果,接口地址如下: http://weather.ya ...

随机推荐

  1. -bash:vi:command not find 问题解决

    Linux命令行输入命令执行后报“bash:vi:command not found”. 这是由于系统PATH设置问题,PATH没有设置对,系统就无法找到精确命令了. 1.在命令行中输入:export ...

  2. django restful framework教程大全

    一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角 ...

  3. Paper | FFDNet: Toward a Fast and Flexible Solution for CNN based Image Denoising

    目录 故事背景 核心思想 FFDNet 网络设置 噪声水平图 对子图像的去噪 保证噪声水平图的有效性 如何盲处理 为啥不用短连接 裁剪像素范围 实验 关于噪声水平图的敏感性 盲处理 发表在2018 T ...

  4. 内网Metasploit映射到外网

    下载frp Github项目地址:https://github.com/fatedier/frp 找到最新的releases下载,系统版本自行确认. 下载方法: wget https://github ...

  5. 物联网架构成长之路(42)-直播流媒体入门(RTMP篇)

    1. 安装RTMP流媒体服务器 以前其实我是利用Nginx-RTMP-module搭建过RTMP流媒体服务器,并实现了鉴权功能.参考https://www.cnblogs.com/wunaozai/p ...

  6. fiddler抓包-8-工作中get到的断点使用

    前言小伙伴有没有遇到这样的情况呢?测试中某个页面传参错误导致关联的功能点没发测试呢?比如APP页面中点击A商品但却跳转到了B商品的页面中,一看原来是商品的id传错了,开发是写死了... 这只是个例子. ...

  7. SpringDataRedis简单入门介绍

    1:问题引入 在实际开发中,开发的每一个项目,每天都有大量的人访问,对数据库造成很大的访问压力,甚至是瘫痪.那如何解决呢?我们通常的做法有两种:一种是数据缓存.一种是网页静态化.我们今天讨论第一种解决 ...

  8. python asyncio call_soon, call_at, call_later

    1. call_soon, 协程一运行就马上运行 def callback(sleep_times): print("success time {}".format(sleep_t ...

  9. windows上mysql解压缩版本、centos上rpm方式的安装、初始化等

    一.windows版本: https://dev.mysql.com/doc/refman/5.7/en/windows-install-archive.html 启动或者暂停mysql服务: htt ...

  10. sql语句将一个表的数据拷贝到另一个表中

    假定有一个a表,一个b表,要将a表的数据拷贝到b表中. 1.如果a表和b表结构相同. insert into b select * from a; 2.如果a表和b表的结构不相同. insert in ...