如何不使用LINQ通过排序法验证字符串是否为变位词?
不使用LINQ通过排序法验证变位词的实现
问题背景
变位词指通过重新排列另一单词或短语的字母形成的单词/短语,字符串处理中可定义为包含完全相同字符及对应数量、仅顺序不同的字符串。已实现两种验证方式:基于LINQ的交集判断、基于foreach循环的字符计数比对,现需实现不依赖LINQ、通过排序法的验证方案。
实现方案
排序法的核心逻辑是:若两个字符串是变位词,将它们的字符排序后得到的序列必然完全一致。具体步骤:
- 先校验两个字符串长度,长度不同直接返回
false(长度不一致不可能是变位词) - 将两个字符串转换为
char数组 - 用不依赖LINQ的排序算法(如冒泡排序)分别对两个数组排序
- 逐字符比对排序后的两个数组,所有字符都匹配则返回
true,否则返回false
完整代码实现
// 不依赖LINQ的冒泡排序方法 private static void BubbleSort(char[] arr) { int n = arr.Length; for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { // 按字符的Unicode值升序排序 if (arr[j] > arr[j + 1]) { // 交换两个字符位置 char temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } // 基于排序法的变位词验证 private static bool CheckAnagramWithSort(string texto1, string texto2) { // 第一步:长度校验 if (texto1.Length != texto2.Length) return false; // 转为字符数组 char[] arr1 = texto1.ToCharArray(); char[] arr2 = texto2.ToCharArray(); // 对两个数组排序 BubbleSort(arr1); BubbleSort(arr2); // 逐字符比对 for (int i = 0; i < arr1.Length; i++) { if (arr1[i] != arr2[i]) return false; } return true; }
代码说明
- 冒泡排序实现:纯嵌套循环实现,无任何LINQ依赖,通过比较字符的Unicode值完成排序,确保相同字符会被排列到同一位置。
- 长度校验:前置校验能快速排除非变位词场景,提升性能。
- 字符比对:排序后逐字符对比,只要有一个位置字符不同,即可判定不是变位词。
可选优化
如果需要忽略大小写(比如认为"Listen"和"Silent"是变位词),可以在转换数组前先统一转为小写/大写:
char[] arr1 = texto1.ToLower().ToCharArray(); char[] arr2 = texto2.ToLower().ToCharArray();
内容的提问来源于stack exchange,提问作者Diego Lobo
相关产品推荐
相关产品推荐

