首页 > 其他分享 >找到字符串中所有字母异位词

找到字符串中所有字母异位词

时间:2024-04-26 14:47:02浏览次数:17  
标签:子串 ab end 异位 字母 start 字符串

Problem: 438. 找到字符串中所有字母异位词

目录

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。

异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

示例 1:

输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
示例 2:

输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

思路

其实也类似于双指针, 使用了字母值为下标的双数组进行比较, 如果区间内的所有字母每个类型都不大于目标字母, 并且区间与目标长度相同, 即判定为相同

Code

func findAnagrams(s string, p string) []int {
	// 将p保存到数组
	result := make([]int, 0)
	pArray := [26]int{}
	sArray := [26]int{}
	for _, v := range p {
		pArray[v-'a']++
	}

	start, end := 0, 0
	for end < len(s) {
		// 将字母逐个加入数组
		sArray[s[end]-'a']++
		// 判断当前的空间是否符合p
		if sArray[s[end]-'a'] > pArray[s[end]-'a'] {
			// 出现了不符合的情况 比如需要1个s 但是现在空间中有两个s
			// 减去一个s
			for s[start] != s[end] {
				sArray[s[start]-'a']--
				start++
			}
			// 直到找到s, 从数组中--
			sArray[s[start]-'a']--
			start++
		}
		// 再判断长度
		if end-start+1 == len(p) {
			// 长度符合 进入字符串相同判断 这个字符串相同判断貌似可以省略?
			result = append(result, start)
		}
		end++
	}
	return result
}

标签:子串,ab,end,异位,字母,start,字符串
From: https://www.cnblogs.com/sunchenxuan/p/18160026

相关文章

  • 利用顺序栈判断字符串是否有效
    数据结构顺序表笔试题:通过键盘输入一个包括'('和')'的字符串string,判断字符串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串需满足以下条件:A.左括号必须用相同类型的右括号闭合。B.左括号必须以正确的顺序闭合。C.每个右括号都有一个对应的相同类型的......
  • 36天【代码随想录算法训练营34期】第八章 贪心算法 part05( ● 435. 无重叠区间 ● 7
    435.无重叠区间classSolution:deferaseOverlapIntervals(self,intervals:List[List[int]])->int:count=0intervals.sort(key=lambdax:x[0])foriinrange(1,len(intervals)):ifintervals[i][0]<intervals[i-......
  • Python 字符串格式化指南
    前言在Python中,字符串格式化是一种常见且重要的操作,用于将变量或值插入到字符串中,并控制输出的格式。本文将介绍几种常见的字符串格式化方法,帮助大家掌握在Python中有效地处理字符串的技巧。方法一:使用%操作符格式化字符串使用%操作符是一种传统的字符串格式化方法,可......
  • Unity性能优化——字符串和文本
    字符串和文本字符串和文本的处理不当是Unity项目中性能问题的常见原因。在C#中,所有字符串均不可变。对字符串的任何操作均会导致分配一个完整的新字符串。这种操作的代价相对比较高,而且在大型字符串上、大型数据集上或紧凑循环中执行时,接连不断的重复的字符串可能发展成性能......
  • 用顺序栈判断输入的字符串是否有效 (笔试题)
    思想:1、先对Manager的Top(栈中有效数据的下标)备份,用循环对字符串进行遍历a.当前字符不为'('和‘)’则进行下一次循环b.当前字符为'('则将'('入栈,并将Manager中的Top(下标)加1c.当前字符为')'则判断当前Top是否与备份的数值相等,如不相等,则')'前面没有'('与之配对,既字符串无效,直......
  • 输入‘(’和‘)’判断字符串有效的函数算法
    ``//设置一个函数,通过输入键盘中的‘(’和‘)’判断字符串是否有效//顺序表中的元素数据类型是char类型typedefcharDataType_t;//创建顺序栈SequenceStack各项数据(栈底地址栈容量栈顶元素下标)的结构体typedefstructSequenceStack{DataType_t*Bottom;//记录栈......
  • 第三章 字符串、向量和数组
    当用+连接string对象和字符串字面值的时候,必须确保有一个操作数是string对象。头文件包含字符处理相关函数使用范围for循环实际上是在使用迭代器循环,所以不能再循环里改变容易容量或执行让迭代器失效的操作。数组的名字在很多情况下会转换成指针,auto会推导出指针,但是decltype还......
  • golang工具函数,把一个金额整型,单位为分,转成"1,231,111.00"格式的字符串
    这个函数首先将整数除以100来获取代表元的浮点数,然后格式化此数值为两位小数的字符串。接下来,函数将字符串分成整数和小数部分,并且为整数部分添加千位分隔符。最后,如果存在小数部分,它会将这两部分重新组合并返回正确格式化的金额字符串。为了正确地处理负数,我们需要先检查金额是......
  • P7114 [NOIP2020] 字符串匹配
    P7114[NOIP2020]字符串匹配看到循环部分\(AB\),自然想要去枚举它,并且用哈希。开始想到的是倍增+hash求出最长循环的右端点,复杂度是\(O(n\logn)\),结果不好写,没写出来。我们先思考找到右端点怎么计算贡献。最朴素的,我们再枚举前缀\(ABAB\cdotsAB\),容易预处理出后缀出现奇数......
  • HJ23 删除字符串中出现次数最少的字符
    利用list的排序来得到最小次数的字符,其中需要注意对map做深拷贝!卡了很久,因为不知道如何处理最小这一点publicclassMain{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);//注意hasNext和hasNextLine的区别......