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

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

接续昨天,最长会问字符串的另一种解法

题目描述

解题过程

    //leetcode最快解法
//.0:该元素坐标,.1 相同数值截止坐标
fn pre_prase(s: String) -> Vec<(usize, usize)> {
let s = s.chars().into_iter().collect::<Vec<char>>(); //iter 转vector
let mut result = Vec::new();
let mut l = 0_usize;
let mut r = 0_usize; loop {
while l < s.len() && r < s.len() && s[l] == s[r] {
r += 1;
} if l > s.len() || r > s.len() {
break;
} result.push((l, r - 1));
l = r;
r = l + 1;
} result
} pub fn longest_palindrome2(s: String) -> String {
let chars = s.chars().into_iter().collect::<Vec<char>>();
let length = chars.len();
// println!("{:?}",chars); // 边界值的处理很垃圾。。。
match length {
0 => return String::from(""),
1 => return s,
2 => {
if chars[0] == chars[1] {
return s;
}
}
_ => (), //什么都不做
}; let mut cur_pos = (0_usize, 0_usize);
let mut cur_len = 0_usize;
let mut max_pos = (0_usize, 0_usize);
let mut max_len = 0_usize;
let poses = Solution::pre_prase(s.clone()).into_iter();
println!("poses:{:?}", poses);
for pos in poses {
// 1 2 3 4 5 6
// i+=1; cur_pos = pos;
cur_len = 0; //从左右两边,选一个短的,这样也保证了后面cur.pos.1+j,cur.pos.0-j都在有效范围之内
let ml = if cur_pos.0 < length - cur_pos.1 - 1 {
cur_pos.0
} else {
length - cur_pos.1 - 1
};
let mut ml = ml + 1;
// println!("cur_pos {:?}, mml {}",cur_pos,ml);
//这个思路好处就是他并不是以字符为单位向左右展开,而是以字符串为单位向左右展开,节省了重复遍历的时间
//相当于一种改进的从中间向两边扩展的情形
for j in 0..ml {
if chars[cur_pos.1 + j] == chars[cur_pos.0 - j] {
cur_len += 1;
} else {
break;
}
}
if 2 * cur_len + cur_pos.1 - cur_pos.0 + 1 > 2 * max_len + max_pos.1 - max_pos.0 + 1 {
max_len = cur_len;
max_pos = cur_pos;
}
// println!("grow pos? {:?} len {} {} > {} ",max_pos,max_len,cur_len + cur_pos.1 - cur_pos.0 + 1, max_len + max_pos.1 - max_pos.0 + 1);
} // println!("res pos {:?} len {} ",max_pos,max_len);
let mut v = Vec::new();
let left = max_pos.0 + 1 - max_len;
let right = max_pos.1 + max_len - 1;
// println!("left {} right {}",left,right);
for i in left..right + 1 {
v.push(chars[i]); //有没有办法不用push,直接用chars的slice方式呢?
}
v.into_iter().collect::<String>()
}
}

一点感悟

这个解法是copy自leetcode别人的解法,

他并不以单个字符为单位进行扩展,而是以字符串为单位,省去了很多重复的工作.

这个复杂度低了很多,没有明确的证明过程,但是感觉应该是在O(N)复杂度,O(NlogN)最多

其他

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

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

  1. 2019.06.05 ABAP EXCEL 操作类代码 OLE方式(模板下载,excel上传,内表下载)

    一般使用标准的excel导入方法9999行,修改了标准的excel导入FM 整合出类:excel的 模板下载,excel上传,ALV内表下载功能. 在项目一开始可以SE24创建一个类来供整体开发使用, ...

  2. 【2019年05月20日】A股滚动市盈率PE历史新低排名

    2010年01月01日 到 2019年05月20日 之间,滚动市盈率历史新低排名. 上市三年以上的公司, 2019年05月20日市盈率在300以下的公司. 1 - 阳光照明(SH600261) - 历 ...

  3. 2019.07.05 纪中_B

    今日膜拜:czj大佬orz%%% 2019.07.05[NOIP提高组]模拟 B 组 今天做题的时候大概能判断出题人的考点,可是就是没学过...特别痛苦 T0:栈的定义,模拟就好了T1:感觉像是找规律 ...

  4. BlackArch Linux 2019.06.01 宣布发布

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

  5. 【2019年05月21日】A股ROE最高排名

    个股滚动ROE = 最近4个季度的归母净利润 / ((期初归母净资产 + 期末归母净资产) / 2). 查看更多个股ROE最高排名. 兰州民百(SH600738) - 滚动ROE:86.45% - 滚 ...

  6. 【2019年05月13日】A股ROE最高排名

    个股滚动ROE = 最近4个季度的归母净利润 / ((期初归母净资产 + 期末归母净资产) / 2). 查看更多个股ROE最高排名. 兰州民百(SH600738) - 滚动ROE:86.45% - 滚 ...

  7. 【2019年05月16日】A股最便宜的股票

    查看更多A股最便宜的股票:androidinvest.com/CNValueTop/ 经典价值三因子选股: 市盈率PE.市净率PB 和 股息分红率,按照 1:1:1的权重,选择前10大最便宜的股票. ...

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

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

  9. [LeetCode]LCP 06. 拿硬币

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

  10. Axure9 v9.0.0.3629 ~ v9.0.0.3633 授权密钥 【2019.02.05】

    现在提供一个支持v9.0.0.3629.v9.0.0.3630.v9.0.0.3631.v9.0.0.3632.v9.0.0.3633的授权码(后续的Beta更新版本应该能继续使用) 被授权人:zd4 ...

随机推荐

  1. Nginx 负载均衡算法

    Nginx 负载均衡算法 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响. upstream tomcat_server { ...

  2. ASP.NET开发实战——(十)ASP.NET MVC 与数据库之MySQL&EF

    之前介绍EF时介绍了provider这个配置项,而且也介绍了在ASP.NET访问MySQL数据仍然是通过ADO.NET,不同的地方仅仅是更换了MySQL的数据提供器,那么在EF中是否也只需更换“提供器 ...

  3. CodeForces - 560D Equivalent Strings

    Today on a lecture about strings Gerald learned a new definition of string equivalency. Two strings ...

  4. DVWA-文件上传学习笔记

    DVWA-文件上传学习笔记 一.文件上传漏洞 文件上传漏洞,通常是由于对上传文件的类型.内容没有进行严格的过滤.检查,导致攻击者恶意上传木马以便获得服务器的webshell权限. 二.DVWA学习 将 ...

  5. C#面试基础知识点:值类型和引用类型(1)(填坑文)

    目录 前言 C#值类型和引用类型 基类(共同点) 值类型继承基类(不同点) 应用类型继承 技术经理的问题 值类型与引用类型都可以用Equals来比较吗? 如何将一个数组a的值赋予数组b然后对b做修改而 ...

  6. Winform中实现设置ZedGraph的GraphPane的大小匹配ZedGraphControl

    场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  7. WinForms中动态给treeView的节点添加ContextMenuStrip,并绑定Click事件

    生成ContextMenuStrip var docMenu = new ContextMenuStrip(); ToolStripMenuItem deleteMenuItem = new Tool ...

  8. vue 上传进度显示

    参考资料: https://ask.csdn.net/questions/767017 https://www.cnblogs.com/best-fyx/p/11363506.html 我使用的是el ...

  9. Markdown 基础学习

    Markdown是什么?    Markdwon是一种轻量级标记语言,它以纯文本形式(易读.易写.易更改)编写文档,并最终以HTLM格式发布.Markdown也可以理解为将以 MARKDOWN语法编写 ...

  10. CMake编译的VS工程,安装时遇到错误:error MSB3073: 命令“setlocal

    错误提示 70>CMake Error at src/base/cmake_install.cmake:63 (file): 70> file INSTALL cannot find 70 ...