LeeCode first day

80 阅读3分钟

1750. 删除字符串两端相同字符后的最短长度

中等

给你一个只包含字符 'a''b' 和 'c' 的字符串 s ,你可以执行下面这个操作(5 个步骤)任意次:

  1. 选择字符串 s 一个 非空 的前缀,这个前缀的所有字符都相同。
  2. 选择字符串 s 一个 非空 的后缀,这个后缀的所有字符都相同。
  3. 前缀和后缀在字符串中任意位置都不能有交集。
  4. 前缀和后缀包含的所有字符都要相同。
  5. 同时删除前缀和后缀。

请你返回对字符串 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 <= 105
  • s 只包含字符 '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,说实话,之前确实不大喜欢算法,今天是第一次开始刷,发现刷下来还是有很多收获的,不管是为了找工作还是学习,后面会继续坚持。。。。。。提升自己永不过时!!!!!!!