欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > LeetCode 3146 两个字符串的排列差

LeetCode 3146 两个字符串的排列差

2025/2/25 1:23:46 来源:https://blog.csdn.net/qq_64604732/article/details/144885474  浏览:    关键词:LeetCode 3146 两个字符串的排列差

计算字符串的排列差

在算法的世界里,常常会遇到一些有趣又巧妙的题目,今天就来和大家分享一道有关字符串处理与计算的题目,希望能帮助大家加深对字符串操作以及相关算法思维的理解。

题目描述

我们给定了两个字符串 s 和 t,这里有两个重要的前提条件哦。一是每个字符串中的字符都不重复,二呢,t 其实是 s 的一个排列。然后引出了一个很有意思的概念 ——“排列差”。所谓 “排列差”,它被定义为 s 和 t 中每个字符在这两个字符串中位置的绝对差值之和。我们的任务就是要写代码来返回 s 和 t 之间的这个 “排列差” 呀。

解题思路分析

那我们该怎么去解决这个问题呢?其实思路可以分为以下几步:

记录字符位置

首先呀,我们得想办法记录每个字符在两个字符串中出现的位置。这里呢,由于题目假设字符都是英文字母(为了方便讲解,咱们先按小写英文字母举例哦,如果有更广泛的字符范围可以相应调整思路),我们可以利用数组来做这件事。创建两个长度为 26 的整数数组,分别叫做 sIndex 和 tIndex,它们的作用就是对应记录字符串 s 和 t 里每个字符出现的位置索引啦。通过遍历字符串,把每个字符(将字符减去 'a' 就能把它映射到 0 - 25 的索引范围,对应到我们创建的数组下标了哦)所在的位置存到相应的数组中去。比如说,如果 s 字符串里第一个字符是 'b',那 sIndex['b' - 'a'] 也就是 sIndex[1] 这个位置就会被赋值为 0 (因为是第一个位置嘛)。

计算排列差

在把字符位置都记录好之后呢,接下来就是核心的计算排列差的步骤啦。我们需要再次遍历这两个记录位置的数组,这次遍历的范围就是从 0 到 25 哦,对应着所有可能出现的英文字母。对于那些在 s 或者 t 中出现过的字符(也就是在对应位置数组里值不为 0 的情况啦),我们要计算它们在两个字符串中位置索引的绝对差值,然后把这些差值都累加到一个变量里,咱们这里把这个变量叫做 diffSum 哦。例如,如果某个字符在 s 中的位置是 3 ,在 t 中的位置是 5 ,那它们的绝对差值 Math.abs(3 - 5) 也就是 2 ,就会被累加到 diffSum 中啦。

返回结果

最后呀,把计算得到的 diffSum 返回出去,这个值就是我们要求的字符串 s 和 t 之间的排列差啦。

代码实现示例

下面呢,就是用 Java 语言实现上述思路的代码,一起来看看吧:

class Solution {public int findPermutationDifference(String s, String t) {int[] sIndex = new int[26];int[] tIndex = new int[26];// 记录字符串s中字符的位置for (int i = 0; i < s.length(); i++) {sIndex[s.charAt(i) - 'a'] = i;}// 记录字符串t中字符的位置for (int i = 0; i < t.length(); i++) {tIndex[t.charAt(i) - 'a'] = i;}int diffSum = 0;// 遍历位置数组,计算并累加绝对差值for (int i = 0; i < 26; i++) {if (sIndex[i]!= 0 || tIndex[i]!= 0) {diffSum += Math.abs(sIndex[i] - tIndex[i]);}}return diffSum;}
}public class Main {public static void main(String[] args) {Solution solution = new Solution();String s = "abc";String t = "cba";int result = solution.findPermutationDifference(s, t);System.out.println("排列差为: " + result);}
}

Solution类中的findPermutationDifference方法

  1. 初始化位置记录数组
    首先创建了两个长度为 26 的整数数组sIndextIndex,用于分别记录字符串st中字符出现的位置。这里假设输入的字符串只包含小写英文字母,通过将字符减去'a'来将其映射到 0 - 25 的索引范围,对应数组的下标,方便记录每个字符在字符串中的位置索引。

  2. 记录字符串中字符位置
    通过两个for循环,分别遍历字符串st。在遍历字符串s时,每当遇到一个字符,就将其在字符串中的位置(也就是当前循环的索引i)记录到sIndex数组中对应的下标位置(通过字符减去'a'得到的下标)。同理,对字符串t进行类似操作,将其字符位置记录到tIndex数组中。

  3. 计算排列差
    再使用一个for循环遍历 0 到 25 的索引(对应所有小写英文字母),对于在s或者t中出现过的字符(也就是sIndextIndex中对应位置不为 0 的情况),计算该字符在两个字符串中位置索引的绝对差值(使用Math.abs方法获取绝对值),并将这个绝对差值累加到diffSum变量中。

  4. 返回排列差结果
    最后,方法返回计算得到的排列差diffSum

Main类中的main方法

  1. 创建Solution类实例
    main方法中,首先创建了Solution类的实例,这样就能调用Solution类中定义的findPermutationDifference方法了。

  2. 定义测试字符串并调用方法
    接着定义了两个示例字符串st,这里只是简单举例用了"abc""cba",你可以替换成任意符合题目要求(字符不重复且一个是另一个的排列)的字符串哦。然后调用solution.findPermutationDifference(s, t)方法来计算这两个字符串之间的排列差,并将结果保存在result变量中。

  3. 输出结果
    最后使用System.out.println将计算得到的排列差结果输出显示,方便查看程序运行的结果是否符合预期。

总结与拓展

通过这道题呀,我们不仅练习了对字符串中字符的操作,比如获取字符、定位字符位置这些基础操作,还深入理解了如何根据题目给定的规则去巧妙地设计算法思路,利用数组这种数据结构来辅助我们完成计算。

不过呢,这道题还有可以拓展思考的地方哦。比如要是输入的字符串里字符范围不只是英文字母了,可能包含数字、标点符号等等各种各样的字符,那我们该怎么去调整代码来适应这种更复杂的情况呢?又或者呀,如果要求我们在时间复杂度或者空间复杂度上做进一步优化,那又可以从哪些方面入手呢?大家可以试着去想一想、改一改代码哦,相信这样能让咱们对算法和数据结构的运用更加熟练呢。

好啦,今天这道有趣的算法题目就分享到这里啦,希望大家都有所收获呀,要是有什么疑问或者想法,欢迎在评论区留言讨论哦!

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词