(关注数据结构和算法,了解更多新知识)
前几天飞书刚宣布裁员,有的人就坐不住了,一位网友说:自己的男朋友在飞书被裁了,上海的房子才买一年,每月有7千房贷和5000房租,怎么办?
这还能怎么办,一份工作而已,又不是得了绝症,工作没了再找,再说失业的又不止他一个。
除了体制内的大多数人都会经历过失业,裁员也不是他的错,你应该做的是安慰自己的男朋友,做好下一步的规划,继续找工作。
我们来看下各位网友的评论,那是相当精彩,千万不要听网友的再找一个,即便找了也不能保证他永远不会失业,到时候如果再失业怎么办呢?再找?
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第242题:有效的字母异位词。
问题描述
来源:LeetCode第242题
难度:简单
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例1:
输入: s = "anagram", t = "nagaram"
输出: true
示例2:
输入: s = "rat", t = "car"
输出: false
1 <= s.length, t.length <= 5 * 10^4
s 和 t 仅包含小写字母
问题分析
这题让判断两个字符串是否是字母异位词,所谓的字母异位词也就是两个字符串中每个字符出现的次数都是一样的,这道比较简单。
我们先统计第一个字符串中每个字符出现的次数,然后再统计第二个字符串中每个字符出现的次数(参照下面的python代码),统计第二个字符串的时候要减去对应字符的次数,如果为负,说明第二个字符串中某个字符比第一个字符串中相同的字符多,他们不可能是字母异位词,直接返回false。
实际上这里还可以优化,使用一个for循环(参照java,c++,c代码),如果最后count数组中每个元素都是0,说明两个字符串中每个字符的个数都是相等的,他们就是字母异位词,直接返回true。
JAVA:
public boolean isAnagram(String s, String t) {
if (s.length() != t.length())
return false;
int[] count = new int[128];
int c = 0;
for (int i = 0; i < s.length(); i++) {
if (++count[s.charAt(i)] == 1) c++;
if (--count[t.charAt(i)] == 0) c--;
}
return c == 0;
}
C++:
public:
bool isAnagram(string s, string t) {
if (s.size() != t.size())
return false;
vector<int> count(128, 0);
int c = 0;
for (int i = 0; i < s.length(); i++) {
if (++count[s[i]] == 1) c++;
if (--count[t[i]] == 0) c--;
}
return c == 0;
}
C:
bool isAnagram(char *s, char *t) {
if (strlen(s) != strlen(t))
return false;
int count[128] = {0};
int c = 0;
for (int i = 0; i < strlen(s); i++) {
if (++count[s[i]] == 1) c++;
if (--count[t[i]] == 0) c--;
}
return c == 0;
}
Python:
def isAnagram(self, s: str, t: str) -> bool:
if len(s) != len(t):
return False
count = [0] * 128
for i in range(0, len(s)):
count[ord(s[i])] += 1
for i in range(0, len(t)):
count[ord(t[i])] -= 1
if count[ord(t[i])] < 0:
return False
return True
笔者简介
博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。