//242. 給定兩個(gè)字符串 s 和 t ,編寫一個(gè)函數(shù)來判斷 t 是否是 s 的字母異位詞。
//
//示例 1:
//
//輸入: s = "anagram", t = "nagaram"
//輸出: true
//示例 2:
//
//輸入: s = "rat", t = "car"
//輸出: false
//說明:
//你可以假設(shè)字符串只包含小寫字母。
//
//來源:力扣(LeetCode)
func main(){
cases := []struct{
s string
t string
}{
{s:"anagram",t:"nagaram"},
{s:"rat",t:"car"},
}
for _, v := range cases {
result := isAnagram(v.s,v.t)
log.Println("isAnagram result:",result)
}
for _, v := range cases {
result := isAnagram2(v.s,v.t)
log.Println("isAnagram2 result:",result)
}
}
// 計(jì)數(shù)器數(shù)表進(jìn)行比較
func isAnagram2(s,t string) bool {
defer timeCost()()
if len(s) != len(t) {
return false
}
var counter [26]byte
for _, ch := range s {
counter[ch-'a']++
}
// 如果使用byte -- 溢出 255
// 使用int8 -- 等于 -1 條件判斷 < 0
for _, ch := range t{
counter[ch-'a']--
if counter[ch-'a'] > byte(len(s)){
return false
}
}
return true
}
// 先排序后進(jìn)行比較
func isAnagram(s ,t string) bool{
if len(s) != len(t) {
return false
}
s = sortString(s)
t = sortString(t)
return strings.Compare(s,t) == 0
}
func sortString(w string) string {
s := strings.Split(w, "")
sort.Strings(s)
return strings.Join(s, "")
}
func timeCost() func() {
start := time.Now()
time.Sleep(time.Nanosecond*100)
return func() {
fmt.Printf("time cost = %v\n", time.Since(start))
}
}