Skip to main content

Command Palette

Search for a command to run...

LeetCode Solution, Medium, 567. Permutation in String

Published

I am not a programmer just a leaner. Writing JavaScript, Python, and Go and doing something on Kubernetes.

567. Permutation in String

題目敘述

Given two strings s1 and s2, return true if s2 contains a permutation of s1, or false otherwise.

In other words, return true if one of s1's permutations is the substring of s2.

Example 1:

Input: s1 = "ab", s2 = "eidbaooo"
Output: true
Explanation: s2 contains one permutation of s1 ("ba").

Example 2:

Input: s1 = "ab", s2 = "eidboaoo"
Output: false

Constraints:

  • 1 <= s1.length, s2.length <= 10^4
  • s1 and s2 consist of lowercase English letters.

題目翻譯

s2 中找出是否有包含 s1 的亂序組合。

解法解析

這題最好的解法就是用 Sliding window 的方式來解,可以使用陣列或 Hash Map 的方式來記錄字母的出現次數來做比對。因為是亂序的不需要記住順序。 簡單介紹 Sliding window 的方式。

s2:2 3 4 1 2 4 2 4 s1:4 1

Sliding window 就是一格一格的滑動過去。

  1. 先比對 s2 的 index 0 跟 1,亦即 2 3 跟 4 1 比對
  2. 然後再滑過去一格 index 1 跟 2,即 3 4 跟 4 1 比對
  3. 再滑一格 index 2 跟 3,4 1 跟 4 1 比對,找到了即答案

程式範例

Go
func checkInclusion(s1 string, s2 string) bool {
    if len(s1) > len(s2) {
        return false
    }

    var s1Map = [26]int{}
    var s2Map = [26]int{}
    for i := 0; i < len(s1); i++ {
        s1Map[s1[i]-'a']++
        s2Map[s2[i]-'a']++
    }

    count := 0
    for i := 0; i < 26; i++ {
        if s1Map[i] == s2Map[i] {
            count++
        }
    }

    for i := 0; i < len(s2)-len(s1); i++ {
        r := s2[i+len(s1)] - 'a'
        l := s2[i] - 'a'

        if count == 26 {
            return true
        }
        s2Map[r]++
        if s1Map[r] == s2Map[r] {
            count++
        } else if s1Map[r]+1 == s2Map[r] {
            count--
        }
        s2Map[l]--
        if s1Map[l] == s2Map[l] {
            count++
        } else if s1Map[l]-1 == s2Map[l] {
            count--
        }
    }

    return count == 26
}
JavaScript
/**
 * @param {string} s1
 * @param {string} s2
 * @return {boolean}
 */
var checkInclusion = function (s1, s2) {
    if (s1.length > s2.length) return false;

    const s1Map = new Array(26).fill(0);
    const s2Map = new Array(26).fill(0);
    for (let i = 0; i < s1.length; i++) {
        s1Map[s1[i].charCodeAt(0) - 97]++;
        s2Map[s2[i].charCodeAt(0) - 97]++;
    }

    let count = 0;
    for (let i = 0; i < 26; i++) {
        if (s1Map[i] === s2Map[i]) {
            count++;
        }
    }

    for (let i = 0; i < s2.length - s1.length; i++) {
        const r = s2[i + s1.length].charCodeAt(0) - 97;
        const l = s2[i].charCodeAt(0) - 97;
        if (count === 26) {
            return true;
        }

        s2Map[r]++;
        if (s1Map[r] === s2Map[r]) {
            count++;
        } else if (s1Map[r] + 1 === s2Map[r]) {
            count--;
        }

        s2Map[l]--;
        if (s1Map[l] === s2Map[l]) {
            count++;
        } else if (s1Map[l] - 1 === s2Map[l]) {
            count--;
        }
    }

    return count === 26;
};
Python
class Solution:
    def checkInclusion(self, s1: str, s2: str) -> bool:
        if len(s1) > len(s2):
            return False

        s1map = [0] * 26
        s2map = [0] * 26
        for i in range(len(s1)):
            s1map[ord(s1[i]) - ord('a')] += 1
            s2map[ord(s2[i]) - ord('a')] += 1

        count = 0
        for i in range(26):
            if s1map[i] == s2map[i]:
                count += 1

        for i in range(len(s2) - len(s1)):
            r = ord(s2[i + len(s1)]) - ord('a')
            l = ord(s2[i]) - ord('a')
            if count == 26:
                return True
            s2map[r] += 1
            if s2map[r] == s1map[r]:
                count += 1
            elif s2map[r] == s1map[r] + 1:
                count -= 1
            s2map[l] -= 1
            if s2map[l] == s1map[l]:
                count += 1
            elif s2map[l] == s1map[l] - 1:
                count -= 1

        return count == 26

Reference

  • https://github.com/Taiwolskit/leetcode/tree/master/Algorithms/567.%20Permutation%20in%20String

LeetCode Solution

Part 1 of 50

A collection of leetcode solustion

More from this blog

如何開始入門軟體工程領域 - 名詞解釋(長期更新)

現在應該開始有很多人想要踏入軟體工程的領域,但在進入這個領域之前,覺得先了解一些名詞,可以在入門時更有方向也更知道要用什麼關鍵字去找尋有用的資訊。這篇文章就是想要幫助想要入門的人理解一些軟體工程裡的專有名詞。 作業系統 這一區塊主要解釋跟作業系統層面相關的名詞 英文中文解釋 Operation system 簡稱 OS | 作業系統 | 就是電腦的作業系統,是三大作業系統分別是:Linux、Windows、macOS | | Linux | | 自由和開放原始碼的 UNI...

May 10, 2023

我的 MacBook Pro (Apple Silicon) 設定

現在開始因為 ChatGPT 的出現,各種 AI 助手的功能都跑出來了。想想自己用了許久的環境設定也應該要來重新審視和建立新的開發環境了,僅此紀錄我個人的環境配置步驟和設定。 環境前置步驟 還原 MacBook Pro 至全新環境 macOS(全部資料刪除) 設定好初始設定後,登入 Apple ID 進入 App Store 確定 macOS 版本和預設 APP 都更新到最新 macOS 版本 到系統設定調整所有設定至個人習慣的設定 三指拖移 觸控板手勢開啟 防火牆開啟 輸入法設定...

Apr 25, 2023

ChatGPT 下的發展預想

從 ChatGPT 問世到現在,有許許多多的文章和討論出來。先從最早的 Google 要完蛋了,到後來的工作要被取代了,工程師失業了。 我就比較沒有想要馬上出來評論一下,我喜歡讓子彈飛一會兒。跟討論一下我自己比較在意的討論點。 Google 為什麼慢了? 結論:因為他需要更小心 很多人說 Google 怎麼被微軟搶先了一步。剛開始 Bing 說要加上 AI 的時候大家都在說 Google 怎麼慢了。我就馬上跑去看 OpenAI 的網站,靠北呀啊就 Azure 贊助的。那當然在正式上線 ChatG...

Mar 23, 2023

不工程的攻城獅

223 posts

I am not a programmer because I am not good at programming. But I do programming. Love to learn new things. An animal lover and a dancer. My oshi is 潤羽るしあ.