问题

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 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. 安装调试mosquitto日志

    1.下载mosquitto安装包https://mosquitto.org/download/2.安装其他依赖包 yum install gcc gcc-c++ libstdc++-devel yum ...

  2. JAVA 实现将多目录多层级文件打成ZIP包后保留层级目录下载 ZIP压缩 下载

    将文件夹保留目录打包为 ZIP 压缩包并下载 上周做了一个需求,要求将数据库保存的 html 界面取出后将服务器下的css和js文件一起打包压缩为ZIP文件,返回给前台:在数据库中保存的是html标签 ...

  3. 集成Facebook SDK之Facebook登录

    前言 这几天应公司需求,需要在项目中接入facebook的登录,现在闲下来后再次巩固一下! 准备工作 保证自己的网络已经翻墙,能够进入Facebook网页 准备一个FB的开发者账号,如果没有可以免费申 ...

  4. 高效C++:资源管理

    C++中资源泄漏一直都是老大难的问题,特别是在嵌入式环境中,一点点的资源泄漏,加上长时间的运行们就会导致程序崩溃,这种问题定位非常困难,无规律偶发.解决问题的一种方式是使用特定工具检查内存泄漏,优点是 ...

  5. .Net Core缓存组件(MemoryCache)【缓存篇(二)】

    一.前言 .Net Core缓存源码 1.上篇.NET Core ResponseCache[缓存篇(一)]中我们提到了使用客户端缓存.和服务端缓存.本文我们介绍MemoryCache缓存组件,说到服 ...

  6. jenkins集群(一) -- 在Linux上部署

    一.安装好jdk.maven.git 1.安装jdk并配置好全局变量 2.安装maven:yum install maven 3.安装jdk:yum install git 二 .安装jenkins ...

  7. 推荐一款技术人必备的接口测试神器:Apifox

    1. 背景 作为互联网行业技术从业者,接口调试是必不可少的一项技能,通常我们都会选择使用 Postman 这类工具来进行接口调试,在接口调试方面 Postman 做的确实非常出色.当然除了Postma ...

  8. Head First HTML与CSS(第2版)PDF高清完整版免费下载|百度云盘

    百度云盘:Head First HTML与CSS(第2版)PDF高清完整版免费下载 提取码:i8q4 内容简介 是不是已经厌倦了那些深奥的HTML书?你可能在抱怨,只有成为专家之后才能读懂那些书.那么 ...

  9. 面试题五十七:和为s的数字

    题目一:和为s的数字,在一个递增数组中寻找两个数字的和等于s 方法:双指针法,一个在头一个在尾:如果两个指针指向的和小于,那么be++:大于end--: 题目二:打印所有和为s的连续正数序列 方法:双 ...

  10. lua 表

    最近在尝试配置 awesome WM,因此粗略地学习了一下 lua . 在学习过程中,我完全被表表在 lua 中的应用所镇住了. 表在 lua 中真的是无处不在:首先,它可以作为字典和数组来用:此外, ...