问题

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4040 访问。

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

输入: s = "anagram", t = "nagaram"

输出: true

输入: s = "rat", t = "car"

输出: false

说明:你可以假设字符串只包含小写字母。

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


Given two strings s and t , write a function to determine if t is an anagram of s.

Input: s = "anagram", t = "nagaram"

Output: true

Input: s = "rat", t = "car"

Output: false

Note:You may assume the string contains only lowercase alphabets.

Follow up:What if the inputs contain unicode characters? How would you adapt your solution to such case?


示例

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4040 访问。

public class Program {

    public static void Main(string[] args) {
string s = "anagram";
string t = "nagaram"; var res = IsAnagram(s, t);
Console.WriteLine(res); s = "rat";
t = "car";
res = IsAnagram2(s, t);
Console.WriteLine(res); s = "program";
t = "pragrom";
res = IsAnagram3(s, t);
Console.WriteLine(res); s = "var";
t = "char";
res = IsAnagram4(s, t);
Console.WriteLine(res); Console.ReadKey();
} private static bool IsAnagram(string s, string t) {
//排序比较法
if(s.Length != t.Length) return false;
var s2 = s.ToList();
s2.Sort();
var t2 = t.ToList();
t2.Sort();
for(var i = 0; i < s2.Count; i++) {
if(s2[i] != t2[i]) return false;
}
return true;
} private static bool IsAnagram2(string s, string t) {
//数组记录法
var s2 = new int[26];
var t2 = new int[26];
foreach(var c in s) {
s2[c - 97]++;
}
foreach(var c in t) {
t2[c - 97]++;
}
for(var i = 0; i < 26; i++) {
if(s2[i] != t2[i]) return false;
}
return true;
} private static bool IsAnagram3(string s, string t) {
//IsAnagram2的变种优化写法
var s2 = new int[26];
foreach(var c in s) {
s2[c - 97]++;
}
foreach(var c in t) {
s2[c - 97]--;
}
foreach(var item in s2) {
if(item != 0) return false;
}
return true;
} private static bool IsAnagram4(string s, string t) {
//哈希法
var dic = new Dictionary<int, int>();
foreach(var c in s) {
if(dic.ContainsKey(c - 97)) {
dic[c - 97]++;
} else {
dic[c - 97] = 1;
}
}
foreach(var c in t) {
if(dic.ContainsKey(c - 97)) {
dic[c - 97]--;
} else {
dic[c - 97] = 1;
}
}
foreach(var item in dic) {
if(item.Value != 0) return false;
}
return true;
} }

以上给出4种算法实现,以下是这个案例的输出结果:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/4040 访问。

True
False
True
False

分析:

显而易见,IsAnagram 的时间复杂度基于所使用的排序算法,其它3种算法的时间复杂度均为: 

C#LeetCode刷题之#242-有效的字母异位词(Valid Anagram)的更多相关文章

  1. LeetCode 242. 有效的字母异位词(Valid Anagram)

    242. 有效的字母异位词 LeetCode242. Valid Anagram 题目描述 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词. 示例 1: 输入: s ...

  2. 前端与算法 leetcode 242. 有效的字母异位词

    目录 # 前端与算法 leetcode 242. 有效的字母异位词 题目描述 概要 提示 解析 解法一:哈希表 解法二:数组判断字符出现次数 解法三:转换字符串 算法 传入测试用例的运行结果 执行结果 ...

  3. Java实现 LeetCode 242 有效的字母异位词

    242. 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示例 1: 输入: s = "anagram", t = " ...

  4. 【LeetCode】242. 有效的字母异位词

    242. 有效的字母异位词 知识点:字符串:哈希表 题目描述 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 注意:若 s 和 t 中每个字符出现的次数都相同,则称  ...

  5. [LeetCode] 242. 有效的字母异位词 valid-anagram(排序)

    注意这里字母异位词的定义是:字母类别及个数都要一样,只是排列顺序不同. class Solution(object): def isAnagram(self, s, t): ""& ...

  6. LeetCode初级算法之字符串:242 有效的字母异位词

    有效的字母异位词 题目地址:https://leetcode-cn.com/problems/valid-anagram/ 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位 ...

  7. C#LeetCode刷题之#520-检测大写字母(Detect Capital)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3947 访问. 给定一个单词,你需要判断单词的大写使用是否正确. ...

  8. C#LeetCode刷题之#125-验证回文串(Valid Palindrome)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3899 访问. 给定一个字符串,验证它是否是回文串,只考虑字母和数 ...

  9. C#LeetCode刷题之#680-验证回文字符串 Ⅱ​​​​​​​(Valid Palindrome II)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3961 访问. 给定一个非空字符串 s,最多删除一个字符.判断是否 ...

随机推荐

  1. [jvm] -- 垃圾收集算法篇

    垃圾收集算法 标记-清除算法 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象. 缺点: 效率问题: 空间问题(标记清除后会产生大量不连续的碎片) 复制算法 它可以将内存分为大小相同 ...

  2. Pollard-Rho

    \(code:\) ll pri[12]={2,3,5,7,11,13,17,19}; ll mul(ll x,ll y,ll mod) { ll c=(long double)x*y/mod+0.5 ...

  3. luoguP1036 选数 暴力AC题解

    luoguP1036 选数 暴力AC题解(非正解) 俗话说得好:暴力出奇迹,打表拿省一. 对于一些暴力就能拿分的题,暴力就好啦QWQ 题目描述   输入格式 输出格式 输入输出样例 定义变量 我们令输 ...

  4. web自动化 -- Keys(键盘操作)

    Keys没啥好讲的 语法:Keys.CONTRAL    等等类似. 下方就是可以  Keys.   跟的键 那些 \ue000  就是对应的  Windows系统中的键盘码,pywin32 也一样的 ...

  5. ✨Shell脚本实现Base64 加密解密

    加密算法 # !/bin/bash # 全局变量 str="" base64_encode_string(){ # 源数据 source_string=$1 echo " ...

  6. 一个简单的Android小实例分享,包含recycleView与recyclerView嵌套

    先上图: 1.首页 2.第二页 3.第三页 项目目录: 代码不多,本人太懒,就不贴了 项目地址:

  7. 一切皆组件的Flutter,安能辨我是雄雌

    从一开始接触Flutter,相信读者都会铭记一句话,那就是--一切皆组件.今天我们就来体会一下这句话的神奇魔力,我们先从实际的产品需求说起. 我们先来看一个简化的运行图: 我们要实现如上图所示的日期选 ...

  8. I Hate It(区间最大问题,线段树)

    很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时 ...

  9. express,node.js实现获取本地文件夹下面的全部图片文件

    http://www.luyixian.cn/javascript_show_169354.aspx 按照网上的教程试了多次,处理了各种结果后还有报错, 最后的报错是cant find module ...

  10. 5.20 省选模拟赛 求和 组合数的性质 EGF CRT

    LINK:求和 绝妙的一道题目.没做绝对亏了. 对于第一个subtask 考虑直接递推出组合数. 对于第二个subtask 考虑EGF 设两个EGF 都只含偶数项指标且系数为1的那种 一个到n一个到m ...