每日说一点:终于谈妥
压抑了很久的工作定位于今凌晨1点终于在电话沟通中初步解决。很多事的成与不成与沟通关联甚重。日常我是个心里有事暂时藏起来的人,但藏不住事也灭不了心里的想法。找了很多朋友谈人生谈人性,不知是我矫情,或是世道如是?
但终归来说,我应该去争取我的意愿,做自己更愿意和热情的事。与我目前助益微薄的琐碎,我想放放。
凌乱了24小时,又开始了心安的自由的生活。
信仰、阅读、刷题、英语、日语、产品,This is my life.
合法异序字符串
Given two strings s and t, write a function to determine if t is an anagram of s.
For example,
s = "anagram", t = "nagaram", return true.
s = "rat", t = "car", return 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?
判断两个字符串,是异序相等的。
解法一:排序
我的第一想法就是排序,既然异序,就将两个字符串排序后,如果一致就是相等的。
上我的代码:
class Solution {
public:
int cnt[26]; //全局变量int数组的初始值才是0;
bool isAnagram(string s, string t) {
//解法二,计数表,排序复杂度nlogn,计数表是n。
for(int i = 0; i < s.length(); i++){
cnt[s[i] - 'a'] ++;
}
for(int i = 0; i < t.length(); i++){ //一样的字母会减去积累
cnt[t[i] - 'a'] --;
}
for(int i = 0; i < 26; i++){
if( cnt[i] ) //如果cnt计数有非零
return false;
}
return true;
}
};
排序时间复杂度是nlogn,相比较于解法二的n,确实笨了。80ms。
解法二:哈希表计数
基于字符数是有限的,就用int数组记下对应角标字符的数量。第一个字符串用++,第二个用--,最终都回归到0平衡时,说明数目都一样。
贴我学习解法二后自己的代码:
class Solution {
public:
int cnt[26]; //全局变量int数组的初始值才是0;
bool isAnagram(string s, string t) {
//解法二,计数表,排序复杂度nlogn,计数表是n。
for(int i = 0; i < s.length(); i++){
cnt[s[i] - 'a'] ++;
}
for(int i = 0; i < t.length(); i++){ //一样的字母会减去积累
cnt[t[i] - 'a'] --;
}
for(int i = 0; i < 26; i++){
if( cnt[i] ) //如果cnt计数有非零
return false;
}
return true;
}
};
复杂度就是n,12ms。此法更快一点。
如果适配Unicode字符?
我想就是不仅限于26个字母,但好在每个Unicode的字符都是有角标的,扩大int数组的容量就好了吧~
周五回家并参加婚礼。我想我该好好陪家人并珍惜时光。
——End——