You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:10:40