每天一道Rust-LeetCode(2019-06-05)
每天一道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)的更多相关文章
- 2019.06.05 ABAP EXCEL 操作类代码 OLE方式(模板下载,excel上传,内表下载)
一般使用标准的excel导入方法9999行,修改了标准的excel导入FM 整合出类:excel的 模板下载,excel上传,ALV内表下载功能. 在项目一开始可以SE24创建一个类来供整体开发使用, ...
- 【2019年05月20日】A股滚动市盈率PE历史新低排名
2010年01月01日 到 2019年05月20日 之间,滚动市盈率历史新低排名. 上市三年以上的公司, 2019年05月20日市盈率在300以下的公司. 1 - 阳光照明(SH600261) - 历 ...
- 2019.07.05 纪中_B
今日膜拜:czj大佬orz%%% 2019.07.05[NOIP提高组]模拟 B 组 今天做题的时候大概能判断出题人的考点,可是就是没学过...特别痛苦 T0:栈的定义,模拟就好了T1:感觉像是找规律 ...
- BlackArch Linux 2019.06.01 宣布发布
导读 BlackArch Linux是一个基于Arch Linux的发行版,专为渗透测试人员和安全研究人员设计,并包含大量渗透测试和安全实用程序,已宣布发布2019.06.01版本. BlackArc ...
- 【2019年05月21日】A股ROE最高排名
个股滚动ROE = 最近4个季度的归母净利润 / ((期初归母净资产 + 期末归母净资产) / 2). 查看更多个股ROE最高排名. 兰州民百(SH600738) - 滚动ROE:86.45% - 滚 ...
- 【2019年05月13日】A股ROE最高排名
个股滚动ROE = 最近4个季度的归母净利润 / ((期初归母净资产 + 期末归母净资产) / 2). 查看更多个股ROE最高排名. 兰州民百(SH600738) - 滚动ROE:86.45% - 滚 ...
- 【2019年05月16日】A股最便宜的股票
查看更多A股最便宜的股票:androidinvest.com/CNValueTop/ 经典价值三因子选股: 市盈率PE.市净率PB 和 股息分红率,按照 1:1:1的权重,选择前10大最便宜的股票. ...
- 2019.06.17课件:[洛谷P1310]表达式的值 题解
P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...
- [LeetCode]LCP 06. 拿硬币
桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中.我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数. 示例 1: 输入:[4,2,1] 输出:4 解释:第一堆力扣 ...
- 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 ...
随机推荐
- Ansible 如何只输出错误信息?
有时主机较多时,我们只想关注有问题的主机. Ansible callback 插件中有一个 actionable,官方描述为: actionable - shows only items that n ...
- Ubuntu 16.04 + OpenCV 自定义环境变量 pkg-config / PKG_CONFIG_PATH
0. 前言 今天在执行一段脚本的时候,爆出错误: Package opencv was not found in the pkg-config search path. Perhaps you sho ...
- mongodb 导出制定的查询结果
1.mongo查询语句: db.quarkContext.find({"submitTime":{"$gt":ISODate("2019-07-13T ...
- python 中in 的 用法
1. 作用为 成员运算符 在字符串内操作,如果字符串包含相关字符 则返回True,如果不包含则返回False 当然处理不单单是只有单个字符,多个连续的字符也是可以处理的 # 单个字符 a= ...
- LCM Walk HDU - 5584
A frog has just learned some number theory, and can't wait to show his ability to his girlfriend. No ...
- springboot2+shiro+jwt整合
参考:https://www.jianshu.com/p/ef0a82d471d2 https://www.jianshu.com/p/3c51832f1051 https://blog.csdn.n ...
- Hashtable 负载因子Load Factor
负载因子(load factor),它用来衡量哈希表的 空/满 程度,一定程度上也可以体现查询的效率,计算公式为: The ratio of the number of elements in the ...
- 对try catch finally的理解
对try catch finally的理解1.finally 总是会运行的,即使在catch中thorw抛出异常了. 2.finally 在 return后没有结束,而是继续运行finally 2. ...
- C#工具类SqlServerHelper,基于System.Data.SqlClient封装
源码: using System; using System.Collections.Generic; using System.Data; using System.Linq; using Syst ...
- maven 学习---Maven配置之pom文件配置包含和排除测试
本文地址:http://blog.csdn.net/wirelessqa/article/details/14057083 包含(Inclusions )默认情况下Surefire Plugin会自动 ...