1750. 删除字符串两端相同字符后的最短长度
中等
给你一个只包含字符 'a','b' 和 'c' 的字符串 s ,你可以执行下面这个操作(5 个步骤)任意次:
- 选择字符串
s一个 非空 的前缀,这个前缀的所有字符都相同。 - 选择字符串
s一个 非空 的后缀,这个后缀的所有字符都相同。 - 前缀和后缀在字符串中任意位置都不能有交集。
- 前缀和后缀包含的所有字符都要相同。
- 同时删除前缀和后缀。
请你返回对字符串 s 执行上面操作任意次以后(可能 0 次),能得到的 最短长度 。
示例 1:
输入: s = "ca"
输出: 2
解释: 你没法删除任何一个字符,所以字符串长度仍然保持不变。
示例 2:
输入: s = "cabaabac"
输出: 0
解释: 最优操作序列为:
- 选择前缀 "c" 和后缀 "c" 并删除它们,得到 s = "abaaba" 。
- 选择前缀 "a" 和后缀 "a" 并删除它们,得到 s = "baab" 。
- 选择前缀 "b" 和后缀 "b" 并删除它们,得到 s = "aa" 。
- 选择前缀 "a" 和后缀 "a" 并删除它们,得到 s = "" 。
示例 3:
输入: s = "aabccabba"
输出: 3
解释: 最优操作序列为:
- 选择前缀 "aa" 和后缀 "a" 并删除它们,得到 s = "bccabb" 。
- 选择前缀 "b" 和后缀 "bb" 并删除它们,得到 s = "cca" 。
提示:
1 <= s.length <= 105s只包含字符'a','b'和'c'。
以上是题目,下面是解题思路 1、需要对比字符串首尾是否为同一字符,不限个数 2、相同则去掉首尾相同字符,继续对比 3、直到最后收尾字符不相同,返回剩余字符长度
然后根据上面思路出了一下答案:
class func deleteStringHexAndPrex(str : String) ->Int{
var strTem : String = str;
if (strTem.count <= 1){
return strTem.count
}
var firstA = strTem.first
var lastB = strTem.last
while (firstA == lastB && strTem.count > 1){
while strTem.first == firstA || strTem.last == lastB{
if strTem.first == firstA{
strTem.removeFirst()
}
if strTem.last == lastB{
strTem.removeLast()
}
}
if (strTem.count > 1){
firstA = strTem.first
lastB = strTem.last
}
}
}
return strTem.count
}
本地执行,没问题,LeeCode 执行,99/100 原因是超时。
检查一下代码,没发现问题,但是竟然没有通过那么肯定有优化空间,开始分析代码和出题目的。 发现有些地方理解错误。
1、没有要求输出最后字符串,只需要计算最后长度 2、过多的移除操作比较耗时
然后出了二版,仅读数据,不移除数据
class fun minStringLength(str : String)-> Int{
let arr : Array = Array(str)
var r = 0;
if (arr.count < 2){
return arr.count
}
var n = arr.count - 1;
while arr[r] == arr[n], n > r {
while arr[r + 1] == arr[n], r + 1 < n{
r += 1
}
while arr[n - 1] == arr[r], n > 1{
n -= 1
}
r += 1
n -= 1
}
return n - r > 0 ? n - r + 1 : (n == r ? 1 : 0)
}
可以看到,整个过程只是读取数据,然后进行对比记录,没有对数据进行修改,最后运行提交:Pass。
总结:在开发中一定要好好理解最终需求,然后不要做多余的操作,多余的操作可能会产生其他问题,也会放后期的代码难以维护,遵行单一职责原则。
同时,数据的操作是比较耗时的,在开发工程中,也需要注意,减少不必要的数据修改。每一份性能的节省都是App流畅运行的基石。
第一次正式刷leeCode,说实话,之前确实不大喜欢算法,今天是第一次开始刷,发现刷下来还是有很多收获的,不管是为了找工作还是学习,后面会继续坚持。。。。。。提升自己永不过时!!!!!!!