字符串的有效分割数量17 Mar 2025 | 6 分钟阅读 问题陈述给定一个字符串 s,您的任务是确定有效分割的数量。如果可以将 s 分成两个非空子字符串 s_first 和 s_second,使得它们的组合等于 s(即 s_first + s_second = s),并且两个子字符串具有相同的不同字母集合,则认为该分割是有效的。 查找字符串 s 中可以形成的有效分割的数量。 Java 实现Java 方法 1:使用 HashMap输出 ![]() 代码解释 此 Java 代码旨在解决查找字符串 s 的“好分割”数量的问题。当 s 变为 sleft 与 sright 的连接,从而得到一个等效的组合字符串 sleft+sright=s 时,发生一个好分割。此外,sleft 应该包含与 sright 相同数量的唯一字母。 为了实现这一点,代码使用了两个 HashMap:left 和 right。它在这些 HashMap 中维护字符串两端出现的每个字符的计数。最初,算法扫描字符串并用其中字符的实例填充 right HashMap。 代码第二次遍历字符串,并用遇到的每个字符更新 left HashMap。同时,它从 right HashMap 中移除,执行与将数字从右侧切换到左侧相反的操作。一旦字符在右侧的计数变为零或负数,该字符的计数将从 HashMap 中移除。 在每个阶段,此代码验证一个数组中是否存在与另一个数组中相同数量的不同字符类型。然后,它将计数增加为一个有效分割。该过程涉及比较 left 和 right HashMap 的大小。 时间复杂度 时间复杂度为 O(N),其中 N 表示输入字符串的长度。对字符串进行一次遍历,同时在 HashMap 中执行获取和移除操作是常数时间。因此,总时间复杂度为 O(N)。 空间复杂度 例如,对于单个 K 字符字母表,空间复杂度为 O(K)。在所有字母都不同的最坏情况下,可能会注意到一个哈希映射最多可以扩展到 k。哈希映射的空间需求与字母表成比例增加,因此,空间复杂度是消息中唯一字符的阶数,这使得结果 Java 方法 2:使用 HashSet输出 ![]() 代码解释 在这里,我将一个“好分割”定义为:可以将字符串 s 分离并创建两个字符串 s_{left} 和 s_{right}。它们必须非空,其中 s_{left}+s_{right}=s,并且与此相比,还必须产生一个改进的度量值。此外,两个字符串必须包含相同数量的不同字符,并且不应有任何缺失字符。 它有两个 HashSet 对象,名为 leftDistinct 和 rightDistinct,用于存储两侧的唯一字母。这些变量是 leftDistinctCount,它跟踪每个数组中每个位置的所有不同字符,而 rightDistinctCount 也从左到右执行此操作。 该算法首先从左到右遍历字符串,将项目添加到 leftDistinct 集合中,并增加 leftDistinctCount 数组中的值。同样,它从右到左进行,逐步调整 rightDistinct 和 rightDistinctCount 数组。 最后,代码然后比较相同位置两侧的唯一字符数量。当计数一致时,它会增加 goodSplits。因此,它成为字符串被分割成两个具有相同类型唯一字母的相等部分的所有可能位置的总和。 时间复杂度 对于输入字符串 s,使用从左到右和从右到左的遍历方向构建一个时间复杂度为 O(N) 的解决方案。 空间复杂度 空间复杂度为 O(N)。创建 HashSet 对象(leftDistinct 和 rightDistinct)和数组(leftDistinctCount 和 rightDistinctCount)需要空间,它们的大小都与输入字符串的长度成比例。 Java 方法 3:使用双指针输出 ![]() 代码解释 此 Java 代码将计算字符串 s 中有多少个有效分割,其中,在每个好分割处,您会得到两个非空子字符串 left 和 right,使得 (left + right) 等于 s。其次,两个子字符串中应该有相同数量的唯一字母。 LeftDistinctCount 和 rightDistinctCount 存储在一个数组中。它通过使用名为 charSet 的 HashSet 来帮助识别唯一字符。 首先,程序检查字符串的长度是否为零或一;如果是,则返回 0。之后,它使用从左到右和从右到左的扫描来计算不同字符。 最后,它将两侧唯一字符的数量与它们各自的匹配位置进行比较。如果匹配数量正确,则增加计数。最终结果是字符串可能被其非重复字母均匀分隔的所有位置的总和。 时间复杂度 该解决方案的时间复杂度最多为 O(N),其中 N = 字符串长度。这意味着两次遍历都具有相同的线性时间复杂度。 空间复杂度 空间复杂度为 O(N)。空间是根据输入字符串长度为数组(leftDistinctCount 和 rightDistinctCount)以及 charSet 中的唯一字符计算的。 结论该算法有效地计算给定字符串中好分割的数量,其中好分割涉及将字符串分成两个非空子字符串,具有相同数量的不同字符。通过使用两个数组和一个 HashSet,它从两端遍历字符串,跟踪不同字符计数。该解决方案演示了 O(N) 的时间复杂度和 O(N) 的空间复杂度。对于“aacaba”这样的输入,代码成功识别并计算了有效分割,为问题提供了可靠的解决方案。 下一主题删除链表中给定键的所有出现 |
我们请求您订阅我们的新闻通讯以获取最新更新。