当前位置: 首页 > news >正文

每日算法----2716. 最小化字符串长度----2025/03/28

目录

        • 1. 题目描述
        • 2. 示例
        • 3. 思路
        • 4. 遇上的问题
        • 5. 具体实现代码
        • 6. 官方题解
        • 7 题目来源

1. 题目描述

给你一个下标从 0 开始的字符串 s ,重复执行下述操作 任意 次:

在字符串中选出一个下标 i ,并使 c 为字符串下标 i 处的字符。并在 i 左侧(如果有)和 右侧(如果有)各 删除 一个距离 i 最近 的字符 c 。
请你通过执行上述操作任意次,使 s 的长度 最小化 。

返回一个表示 最小化 字符串的长度的整数。

2. 示例
示例 1:

输入:s = "aaabc"
输出:3
解释:在这个示例中,s 等于 "aaabc" 。我们可以选择位于下标 1 处的字符 'a' 开始。接着删除下标 1 左侧最近的那个 'a'(位于下标 0)以及下标 1 右侧最近的那个 'a'(位于下标 2)。执行操作后,字符串变为 "abc" 。继续对字符串执行任何操作都不会改变其长度。因此,最小化字符串的长度是 3 。
示例 2:

输入:s = "cbbd"
输出:3
解释:我们可以选择位于下标 1 处的字符 'b' 开始。下标 1 左侧不存在字符 'b' ,但右侧存在一个字符 'b'(位于下标 2),所以会删除位于下标 2 的字符 'b' 。执行操作后,字符串变为 "cbd" 。继续对字符串执行任何操作都不会改变其长度。因此,最小化字符串的长度是 3 。
示例 3:

输入:s = "dddaaa"
输出:2
解释:我们可以选择位于下标 1 处的字符 'd' 开始。接着删除下标 1 左侧最近的那个 'd'(位于下标 0)以及下标 1 右侧最近的那个 'd'(位于下标 2)。执行操作后,字符串变为 "daaa" 。继续对新字符串执行操作,可以选择位于下标 2 的字符 'a' 。接着删除下标 2 左侧最近的那个 'a'(位于下标 1)以及下标 2 右侧最近的那个 'a'(位于下标 3)。执行操作后,字符串变为 "da" 。继续对字符串执行任何操作都不会改变其长度。因此,最小化字符串的长度是 2 。
 

提示:

1 <= s.length <= 100
s 仅由小写英文字母组成
3. 思路
  1. 遍历一遍字符串,
  2. 每次遍历的时候,从中心往两边比较左右两边是否有相同字符,
  3. 有则替换。
4. 遇上的问题

在替换的时候遇到的问题 slice[i:j],是左包右不包的
自己写的代码虽然阅读易懂,但是看着还是太笨长了

5. 具体实现代码
package main

import "fmt"

//2716. 最小化字符串长度
/*
给你一个下标从 0 开始的字符串 s ,重复执行下述操作 任意 次:

在字符串中选出一个下标 i ,并使 c 为字符串下标 i 处的字符。并在 i 左侧(如果有)和 右侧(如果有)各 删除 一个距离 i 最近 的字符 c 。
请你通过执行上述操作任意次,使 s 的长度 最小化 。

返回一个表示 最小化 字符串的长度的整数。
 */

var (
	leftFlag = false
	rightFlag = true
	noResultFlag = -1
)

func minimizedStringLength(s string) int {
	for i:=0;i<len(s);{
		tempStr1 := ""
		tempStr2 := ""
		nextIndex := 0
		if i >= len(s){
			break
		}

		if i != 0{
			tempStr1 = s[:i]
			// 寻找
			leftIndex := minimizedStringLengthFindIndex(s[:i],s[i],leftFlag)
			// 替换
			if leftIndex != noResultFlag{
				tempStr1 = s[:leftIndex] + s[leftIndex+1:i]
				nextIndex --
			}
		}
		if i != len(s)-1{
			tempStr2 = s[i+1:]
			// 寻找
			rightIndex := minimizedStringLengthFindIndex(s[i+1:],s[i],rightFlag)
			// 替换
			if  rightIndex != noResultFlag{
				tempStr2 = s[i+1:i+1+rightIndex] + s[i+1+rightIndex+1:]
			}
		}
		// 修改s
		nextIndex++
		s = tempStr1 + string(s[i]) + tempStr2
		// 更新下次遍历索引
		i= i+nextIndex
	}
	return len(s)
}

func minimizedStringLengthFindIndex(s string, target uint8,flag bool) int{
	index := -1
	if flag == leftFlag{
		for i := len(s)-1;i>=0;i-- {
			if s[i] == target{
				index = i
				break
			}
		}
	}else {
		for i := 0;i<len(s);i++ {
			if s[i] == target{
				index = i
				break
			}
		}
	}
	return  index
}

func main()  {
	result := minimizedStringLength("iilcuscicwq")
	fmt.Println(result)
	//result = minimizedStringLength("cbbd")
	//fmt.Println(result)
}

6. 官方题解
func minimizedStringLength(s string) int {
	var mask uint
	for _, c := range s {
		mask |= 1 << (c - 'a')
	}
	return bits.OnesCount(mask)
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/minimize-string-length/solutions/3614466/zui-xiao-hua-zi-fu-chuan-chang-du-by-lee-o801/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

虽然有考虑过去重就好,但是题目描述里要求的 从中心到两边去重相邻的字符。。

7 题目来源

链接: link


如果题解是产品需求,在工作上也能达到目的,但是不太符合产品的逻辑,还是不太认可。------swrici

相关文章:

  • Android 系统ContentProvider流程
  • 【Hysteria】部署+测试
  • 深入了解Linux内核:task_struct结构详解
  • WinForm真入门-简介
  • react如何引用(按需加载)百度地图,并结合and组件化封装
  • 【leetcode】拆解与整合:分治并归的算法逻辑
  • ​​​​​​Spring Boot热部署插件
  • 【第33节】windows原理:初探PE文件
  • 用 pytorch 从零开始创建大语言模型(三):编码注意力机制
  • 详解CountDownLatch底层源码
  • SQL:CASE WHEN使用详解
  • 二层网络综合实验
  • 从 JDK 11 到 JDK 17:OpenRewrite 实战 Spring Boot 升级指南
  • 项目-苍穹外卖(十七) Apache POI+导出数据
  • 路由器DHCP地址池冲突
  • 【网络协议详解】—— STP 、RSTP、MSTP技术(学习笔记)
  • 15 网络编程:三要素(IP地址、端口、协议)、UDP通信实现和TCP通信实现 (黑马Java视频笔记)
  • C语言复习笔记--操作符详解(下)
  • 蓝桥杯 之 LCA算法
  • 搜广推校招面经六十一
  • 量子传感新技术“攻克”退相干难题
  • 辽宁省全力开展辽阳一饭店火灾事故救援处置工作
  • 王沪宁主持召开全国政协主席会议
  • 国家核准10台核电新机组,四大核电央企披露新项目进展
  • 第1现场|无军用物资!伊朗港口爆炸已遇难40人伤1200人
  • 贸促会答澎湃:5月22日将举办2025年贸易投资促进峰会