有效的字母异位词

力扣题目链接(opens new window)

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

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

示例 2: 输入: s = "rat", t = "car" 输出: false

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

思路

暴力法

两层for循环,逐个比较输入的两字符串的所有字母是否是相同的,如果是,则为字母异位词

class Solution {
public boolean isAnagram(String s, String t) {
int count = 0;
for(int i = 0; i < s.length(); i++){
for(int j = 0; j < t.length(); j++){
if(s.charAt(i) == t.charAt(j)){
count++;
}
}
} if(count == s.length()){
return true;
}else{
return false;
}
}
}

问题:没有考虑相同字母多次出现的情况

目前暴力法的复杂度已经是n*n了,加上相同字母的标记肯定更复杂,很可能超时

应该使用后别的更优的方法去解题

哈希法

要用哈希法,那肯定要选择一种哈希结构来储存数据(区别于简介:详见

  • 数组
  • set
  • map

选哪种呢?

本题给的数据输入是字符串,且条件是字符串只包含小写字母

也就是a-z,一共26个

除此之外,字母a-z的ASCII码是连续的

小规模连续数据,我们可以考虑用数组来存储

先定义一个长度为26的数组hash

遍历字符串s,记录每个字母出现的次数,并在hash的对应位置累加(就是++)

然后遍历字符串t,记录每个字母出现的次数,并在hash对应位置累减(就是--)

当遍历结束,我们去访问数组的所有元素

如果均为0,那么代表着字符串s中的字母也在字符串t中出现了一遍(因此累加累减相互抵消)

如果出现了不是0的数,那么至少有一方的某个字母多出现几次,则不满足条件

这样就可以判断这个字符串是否为字母异位词

代码

思路大致就是上面的,但是代码实现起来依旧有技巧(感觉每道题都差不多是这样,要么代码有坑要么思路有坑)

java版
class Solution {
public boolean isAnagram(String s, String t) {
int[] hash = new int[26]; for(int i = 0; i < s.length(); i++){
// //获取当前字母所在位置
// //通过与a作差就能够过ASCII码的差值找到当前之母的对应位置
// //例如,a和a相减是ASCII值相减,结果为0,a也就位于字母表0~25的第0个
// int index_s = s.charAt(i) - 'a';
// //对应字母出现次数计数累加
// hash[index_s]++;
//合起来写如下
hash[s.charAt(i) - 'a']++;
} for(int j = 0; j < t.length(); j++){
// //同理
// int index_t = t.charAt(j) - 'a';
// hash[index_t]--;
hash[t.charAt(j) - 'a']--;
} //判断hash数组是否全为0
for(int i = 0; i < 26; i++){
if(hash[i] != 0){
return false;
}
}
return true;
}
}
c++版
class Solution {
public:
bool isAnagram(string s, string t) {
//定义hash数组
int hash[26] = {0}; //遍历第一个字符串,并在hash数组中标记
for(int i = 0; i < s.size(); i++){
int index = s[i] - 'a';
hash[index]++;
}
//遍历第二个字符串,并在hash数组中标记
for(int i = 0; i < t.size(); i++){
int index = t[i] - 'a';
hash[index]--;
} //遍历hash数组确认元素是否均为0
for(int i = 0; i < 26; i++){
if(hash[i] != 0){
return false;
}
}
return true;
}
};

注意:

在初始化hash数组时一定要赋初值,要不然按照编译器默认的初始值进行后面的计算会出错

#include<iostream>
using namespace std;
#include<string> int main() {
int hash[26];//输出为-858993460
int hash[26] = {0};//输出为0
cout << (int)hash[0] << endl;
}
考察点总结
1、定位字母所在位置

这里使用了ASCII码值相减的方法来确定遍历到的字母具体位于0~25的哪里

实现这种方式的前提是:字母的ASCII码是连续的

2、遍历字符串

Java中:

str = "dayceng"
for(int j = 0; j < str.length(); j++){
//使用charAt()来得到字符串中j位置的字母
System.out.println(str.charAt(j));
}

CPP中:

str = "dayceng"
for(int j = 0; j < str.size(); j++){
//直接把字符串当成类似Python中的"列表"来操作即可
cout << str[j] << endl;
}

赎金信

力扣题目链接(opens new window)

给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。

(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)

注意:

你可以假设两个字符串均只含有小写字母。

canConstruct("a", "b") -> false

canConstruct("aa", "ab") -> false

canConstruct("aa", "aab") -> true

思路

有效字母异位词基本一致

也是使用数组作为哈希表,通过在字符作差,在数组中相应位置标记来判断两个字符串中的字母是否对应出现过

唯一需要注意的是,这里问题中是要判断“一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成

因此需要先遍历magazines,再遍历ransom,此时若数组中出现负数,则直接克以判定false

代码

class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int hash[26] = {0};//使用数组作为哈希表
//如果ransomNote长度大于magazine,肯定false if(ransomNote.size() > magazine.size()){
return false;
}
//看题目要求:判断 ransomNote 能不能由 magazine 里面的字符构成
//所以先遍历magazine字符串
for(int i = 0; i < magazine.size(); i++){
int index = magazine[i] - 'a';
hash[index]++;
}
//遍历ransomNote字符串
for(int j = 0; j < ransomNote.size(); j++){
int index = ransomNote[j] - 'a';
hash[index]--;
//如果出现负数,证明ransomNote里出现了magazine中没有的字母,直接挂
if(hash[index] < 0){
return false;
}
}
return true;
}
};

【LeetCode哈希表#1】有效的字母异位词+赎金信(数组)的更多相关文章

  1. C#LeetCode刷题之#242-有效的字母异位词(Valid Anagram)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4040 访问. 给定两个字符串 s 和 t ,编写一个函数来判断 ...

  2. 有效的字母异位词&两个数组的交集& 快乐数& 两数之和

    一.有效的字母异位词 242. 有效的字母异位词 1.方法概述 因为本题中字符串只包含小写字母,就可以定义一个数组来记录字符串中字符出现的次数.遍历第一个字符串,用charAt拿到对应的小写字母然后减 ...

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

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

  4. LeetCode 49: 字母异位词分组 Group Anagrams

    LeetCode 49: 字母异位词分组 Group Anagrams 题目: 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. Given an array o ...

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

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

  6. 【LeetCode】49. 字母异位词分组

    49. 字母异位词分组 知识点:字符串:哈希表 题目描述 给你一个字符串数组,请你将 字母异位词 组合在一起.可以按任意顺序返回结果列表. 字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源 ...

  7. Leetcode题库——49.字母异位词分组【##】

    @author: ZZQ @software: PyCharm @file: leetcode49_groupAnagrams.py @time: 2018/11/19 13:18 要求:给定一个字符 ...

  8. LeetCode:字母异位词分组【16】

    LeetCode:字母异位词分组[16] 题目描述 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", &quo ...

  9. Leetcode 49.字母异位词分组

    字母异位词分组 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", " ...

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

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

随机推荐

  1. ElasticSearch集群灾难:别放弃,也许能再抢救一下 | 京东云技术团队

    ​ 1 前言 Elasticsearch作为一个分布式搜索引擎,自身是高可用的:但也架不住一些特殊情况的发生,如: 集群超过半数的master节点丢失,ES的节点无法形成一个集群,进而导致集群不可用: ...

  2. 在k8s中的控制器和部署服务-ReplicationController和ReplicaSet

    pod 代表了 k8s 中的基本部署单元,但是在实际应用场景中,服务不可能是单个pod运行的,否则会出现"单点".在 k8s 中对 pod 的托管部署,专门抽象成了单独的资源.其中 ...

  3. vue启动报错_interopRequireDefault is not a function

    起因 今天接触一个项目vue. 在安装好环境之后,启动的时候报错_interopRequireDefault is not a function 解决的办法:我觉得可能是因为node_modules安 ...

  4. TypeScript中泛型<T>详细讲解

    1.泛型 在定义函数或者接口或者类的时候 不能预先确定要使用的数据类型 而是在使用函数.接口.或者类的时候才能够确定数据类型 这个时候我们就需要使用的是泛型 2.功能描述 我们需要实现一个方法,方法中 ...

  5. 7.4 C/C++ 实现链表栈

    相对于顺序栈,链表栈的内存使用更加灵活,因为链表栈的内存空间是通过动态分配获得的,它不需要在创建时确定其大小,而是根据需要逐个分配节点.当需要压入一个新的元素时,只需要分配一个新的节点,并将其插入到链 ...

  6. C# 中的函数与方法

    在C#中,函数和方法都是一段可重用的代码块,用于实现特定的功能.函数是C#中的基本代码块之一,用于完成特定的任务和返回一个值.函数可以具有零个或多个参数,并且可以使用关键字来指定函数的访问级别和返回类 ...

  7. MongoDB 7.0 搭建 Sharding 副本集群

    本文是在ubuntu 22.03 系统版本上部署的,最低支持mongodb-6.0.4以上,所以这里安装mongodb7.0 1 安装mongo 安装方式有多种,本人是使用的第一种方式,时间也就20分 ...

  8. 在K8S中,Pod亲和性概念是什么?

    在Kubernetes(简称K8S)中,Pod亲和性和反亲和性(Affinity and Anti-Affinity)是集群调度策略的重要组成部分,它们用于控制Pod如何与节点或其他Pod相对应地放置 ...

  9. 全流程机器视觉工程开发(三)任务前瞻 - 从opencv的安装编译说起,到图像增强和分割

    前言 最近开始做这个裂缝识别的任务了,大大小小的问题我已经摸得差不多了,然后关于识别任务和分割任务我现在也弄的差不多了. 现在开始做正式的业务,也就是我们说的裂缝识别的任务.作为前言,先来说说场景: ...

  10. 【Linux】常用基本指令大汇总系列(篇一)【超详细的图解保姆教程】

    常用基本指令大汇总系列(篇一) 大家好,欢迎大家来到我的博客.从今天开始,博主就要开启一个全新的系列了!Linux操作系统常用基本指令汇总系列,当大家按顺序学完这个系列,在Linux上编写基本的C语言 ...