zoukankan      html  css  js  c++  java
  • 242. 有效的字母异位词

    242. 有效的字母异位词

    给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

    示例 1:

      输入: s = "anagram", t = "nagaram"
      输出: true
    示例 2:

      输入: s = "rat", t = "car"
      输出: false
    说明:
      你可以假设字符串只包含小写字母。

    进阶:
      如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

    代码:

    #include<iostream>
    #include<cstring>
    using namespace std;
    int main(){
        string str1,str2;
        cin>>str1>>str2;
        int arr[27]={0},i=0;
        while(str1[i]){
            arr[str1[i++]-'a']++;
        }
        i=0;
        while (str2[i])
        {
            arr[str1[i++]-'a']--;
        }
        for (int i = 0; i < 26; i++)
        {
            if (arr[i]!=0)
            {
                cout<<"false"<<endl;
                return 0;
            }
        }
        cout<<"true"<<endl;   
    }

     

    方法一:排序

    算法:
    通过将 s 的字母重新排列成 t来生成变位词。因此,如果 T 是 S的变位词,对两个字符串进行排序将产生两个相同的字符串。此外,如果 s和 t 的长度不同,t不能是 s 的变位词,我们可以提前返回。

    #include<iostream>
    #include<bits/stdc++.h>
    #include<cstring>
    using namespace std;
    
    int main(){
    
        string str1,str2;
        cin>>str1>>str2;
        sort(str1.begin(),str1.end());
        sort(str2.begin(),str2.end());
        // cout<<str1<<"   "<<str2<<endl;
    
        if (str1==str2)
        {
            cout<<"true"<<endl;
        }else
        {
            cout<<"false"<<endl;
        }
    }

     

    复杂度分析

    时间复杂度:O(nlogn),假设 n 是 s 的长度,排序成本O(nlogn) 和比较两个字符串的成本 O(n)。排序时间占主导地位,总体时间复杂度为O(nlogn)。
    空间复杂度:O(1),空间取决于排序实现,如果使用 heapsort,通常需要 O(1) 辅助空间。

     

    方法二:哈希表

    算法:

    为了检查 t 是否是 s 的重新排列,我们可以计算两个字符串中每个字母的出现次数并进行比较。因为 S 和 T 都只包含 A-Z 的字母,所以一个简单的 26 位计数器表就足够了。
    我们需要两个计数器数表进行比较吗?实际上不是,因为我们可以用一个计数器表计算 s 字母的频率,用 t减少计数器表中的每个字母的计数器,然后检查计数器是否回到零。

    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        int[] counter = new int[26];
        for (int i = 0; i < s.length(); i++) {
            counter[s.charAt(i) - 'a']++;
            counter[t.charAt(i) - 'a']--;
        }
        for (int count : counter) {
            if (count != 0) {
                return false;
            }
        }
        return true;
    }

    或者我们可以先用计数器表计算 s,然后用 t 减少计数器表中的每个字母的计数器。如果在任何时候计数器低于零,我们知道 t 包含一个不在 s 中的额外字母,并立即返回 FALSE。

    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length()) {
            return false;
        }
        int[] table = new int[26];
        for (int i = 0; i < s.length(); i++) {
            table[s.charAt(i) - 'a']++;
        }
        for (int i = 0; i < t.length(); i++) {
            table[t.charAt(i) - 'a']--;
            if (table[t.charAt(i) - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }

     

    复杂度分析

    时间复杂度:O(n)。时间复杂度为 O(n) 因为访问计数器表是一个固定的时间操作。
    空间复杂度:O(1)。尽管我们使用了额外的空间,但是空间的复杂性是 O(1),因为无论 N 有多大,表的大小都保持不变。
    进阶:
    如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

    解答:
    使用哈希表而不是固定大小的计数器。想象一下,分配一个大的数组来适应整个 Unicode 字符范围,这个范围可能超过 100万。哈希表是一种更通用的解决方案,可以适应任何字符范围。

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13488164.html

  • 相关阅读:
    开放源码的对象关系映射工具ORM.NET 插入数据 Insert/Update Data
    开放源码的对象关系映射工具ORM.NET 快档开发入门 Quick Start
    .NET 动态脚本语言Script.NET 开发指南
    开放源码的对象关系映射工具ORM.NET 删除数据 Deleting Records using ORM.NET
    .NET Remoting过时了吗?为什么公司的项目还是选择用.NET Remoting,而不是WCF?
    开放源码的对象关系映射工具ORM.NET 查看和显示数据 View and Display data using ORM.NET
    开放源码的对象关系映射工具ORM.NET 查询表 调用存储过程 增加自定义代码
    技术人生:坚持,每日一博
    CQRS:CQRS + DDD + MDP 实现快速应用程序开发
    NodeJs:Happy代码生成器,重构了代码,更新了文档,完善了示例,欢迎下载使用
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13488164.html
Copyright © 2011-2022 走看看