Skip to content

Prepare For Coder Interview – Denny

  • Basic
  • Medium
  • Hard
  • Architect
  • Life

LeetCode: Check If a String Can Break Another String

Posted on April 29, 2020July 26, 2020 by braindenny

Identity number which appears exactly once.



Similar Problems:

  • CheatSheet: LeetCode For Code Interview
  • CheatSheet: Common Code Problems & Follow-ups
  • Tag: #greedy, #string, #twopointer

Given two strings: s1 and s2 with the same size, check if some permutation of string s1 can break some permutation of string s2 or vice-versa (in other words s2 can break s1).

A string x can break string y (both of size n) if x[i] >= y[i] (in alphabetical order) for all i between 0 and n-1.

Example 1:

Input: s1 = "abc", s2 = "xya"
Output: true
Explanation: "ayx" is a permutation of s2="xya" which can break to string "abc" which is a permutation of s1="abc".

Example 2:

Input: s1 = "abe", s2 = "acd"
Output: false 
Explanation: All permutations for s1="abe" are: "abe", "aeb", "bae", "bea", "eab" and "eba" and all permutation for s2="acd" are: "acd", "adc", "cad", "cda", "dac" and "dca". However, there is not any permutation from s1 which can break some permutation from s2 and vice-versa.

Example 3:

Input: s1 = "leetcodee", s2 = "interview"
Output: true

Constraints:

  • s1.length == n
  • s2.length == n
  • 1 <= n <= 10^5
  • All strings consist of lowercase English letters.

Github: code.dennyzhang.com

Credits To: leetcode.com

Leave me comments, if you have better ways to solve.


  • Solution:
## https://code.dennyzhang.com/check-if-a-string-can-break-another-string
## Basic Ideas: two pointer + greedy
##
## The order doesn't matter.
## For the same characters in both two string, remove them
##
## Complexity: Time ?, Space ?
class Solution:
    def checkIfCanBreak(self, s1: str, s2: str) -> bool:
        def mycheck(s1, s2):
            n = len(s1)
            cnt1, cnt2 = [0]*26, [0]*26
            for ch in s1:
                cnt1[ord(ch)-ord('a')] += 1
            for ch in s2:
                index = ord(ch)-ord('a')
                if cnt1[index]>0:
                    cnt1[index] -= 1
                else:
                    cnt2[index] += 1
            l1, l2 = [], []
            for i in range(26):
                if cnt1[i] != 0:
                    l1.extend([chr(ord('a')+i)]*cnt1[i])
                if cnt2[i] != 0:
                    l2.extend([chr(ord('a')+i)]*cnt2[i])
            for i in range(len(l1)):
                if l1[i]<l2[i]: return False
            return True
        return mycheck(s1, s2) or mycheck(s2, s1)
linkedin
github
slack

Post Views: 0
Posted in MediumTagged #greedy, #string, #twopointer

Post navigation

LeetCode: Max Difference You Can Get From Changing an Integer
LeetCode: Number of Ways to Wear Different Hats to Each Other

Leave a Reply Cancel reply

Your email address will not be published.

Tags

#array #backtracking #bfs #binarytree #bitmanipulation #blog #classic #codetemplate #combination #dfs #dynamicprogramming #game #graph #greedy #heap #inspiring #interval #linkedlist #manydetails #math #palindrome #recursive #slidingwindow #stack #string #subarray #trie #twopointer #twosum binarysearch editdistance hashmap intervaldp knapsack monotone oodesign presum rectangle redo review rotatelist series sql treetraversal unionfind

Recent Posts

  • a
  • a
  • a
  • a
  • a

Recent Comments

    Archives

    Categories

    • Amusing
    • Basic
    • Easy
    • Hard
    • Life
    • Medium
    • Resource
    • Review
    • Series
    • Uncategorized
    Proudly powered by WordPress | Theme: petals by Aurorum.