前端與算法 leetcode 242. 有效的字母異位詞

[TOC]javascript

前端與算法 leetcode 242. 有效的字母異位詞


題目描述

給定兩個字符串 s 和 t ,編寫一個函數來判斷 t 是不是 s 的字母異位詞。前端

示例 1:java

輸入: s = "anagram", t = "nagaram"
輸出: true

示例 2:git

輸入: s = "rat", t = "car"
輸出: false
說明:
你能夠假設字符串只包含小寫字母。

進階:
若是輸入字符串包含 unicode 字符怎麼辦?你可否調整你的解法來應對這種狀況?github

242. 有效的字母異位詞算法

概要

判斷異位詞的方法不少,能夠用哈希表,也能夠構建26個字符數組判斷,還能夠根據每一個字符出現的次數排序後判斷字符串是否相等數組

提示

哈希,數組函數

解析

解法一:哈希表

哈希表在本題中表現通常,但看到這題時每每第一時間就能想到這個辦法.構建一個HashMap而後統計s中每一個單詞出現的次數,隨後用這個表去判斷第t中全部字符出現的次數,一旦字符出現的次數不相等或者沒有這個字符就返回false測試

解法二:數組判斷字符出現次數

構建一個長度爲26的數組而後所有填充0,隨後s中的s[i]字符出現一次該下標位置的數字就自加一次,t[i]對應的下標自減一次,最後的結果中有一個不爲0則表示s和t不相等code

解法三:轉換字符串

和解法二思路相似,但其實就是排序後判斷字符串是否相等

算法

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var isAnagram = function (s, t) {
  // 哈希法
  // if (s.length !== t.length) {return false;}
  // let map = new Map();
  // for (let i = 0;i < s.length;i++) {
  //   map.get(s[i]) === undefined ? map.set(s[i], 1) : map.set(s[i], map.get(s[i]) + 1);
  // }
  // for (let j = 0;j < t.length;j++) {
  //   if (map.get(t[j]) > 0) {map.set(t[j], (map.get(t[j])) - 1);} else {return false;}
  // }
  // return true;
  // 26個字符法
  if (s.length !== t.length) {return false;}
  let kmap = new Array(26).fill(0);
  for (let i = 0 ;i < s.length;i++) {
    kmap[s[i].charCodeAt(0) - 97]++;
    kmap[t[i].charCodeAt(0) - 97]--;
  }
  for (let i = 0;i < 26;i++) {
    if (kmap[i] !== 0) {return false;}
  }
  return true;
  // 解法三
  // if (s.length !== t.length) return false
  // let o = new Array(26).fill(0)
  // for (let i = 0; i < s.length; i++) {
  //   o[s[i].charCodeAt(0) - 97]++
  // }
  // let p = new Array(26).fill(0)
  // for (let i = 0; i < t.length; i++) {
  //   p[t[i].charCodeAt(0) - 97]++
  // }
  // o = o.toString()
  // p = p.toString()
  // return o === p
};

傳入測試用例的運行結果

input:"rat","art"
output:true

執行結果

執行用時 :68 ms, 在全部 javascript 提交中擊敗了98.28%的用戶
內存消耗 :35.7 MB, 在全部 javascript 提交中擊敗了87.50%的用戶

GitHub倉庫

242. 有效的字母異位詞

相關文章
相關標籤/搜索