[LeetCode] 696. Count Binary Substrings 문제 풀이 보고서 (Python)

11335 단어 LeetCode알고리즘
저자: 음 설 명 초 id: fuxuemingzhu 개인 블 로그:http://fuxuemingzhu.cn/
목차
  • 제목 설명
  • 제목 대의
  • 문제 풀이 방법
  • 방법 1: 폭력 해법 (TLE)
  • 방법 2: 연속 서브 꼬치 계산
  • 날짜
  • 제목 주소:https://leetcode.com/problems/baseball-game/description/
    제목 설명
    Give a string s, count the number of non-empty (contiguous) substrings that have the same number of 0’s and 1’s, and all the 0’s and all the 1’s in these substrings are grouped consecutively.
    Substrings that occur multiple times are counted the number of times they occur.
    Example 1:
    Input: "00110011"
    Output: 6
    Explanation: There are 6 substrings that have equal number of consecutive 1's and 0's: "0011", "01", "1100", "10", "0011", and "01".
    
    Notice that some of these substrings repeat and are counted the number of times they occur.
    
    Also, "00110011" is not a valid substring because all the 0's (and 1's) are not grouped together.
    Example 2:
    Input: "10101"
    Output: 4
    Explanation: There are 4 substrings: "10", "01", "10", "01" that have equal number of consecutive 1's and 0's.
    

    Note:
  • s.length will be between 1 and 50,000.
  • s will only consist of “0” or “1” characters.

  • 제목 의 대의
    하나의 문자열 은 01 로 구성 되 어 있 으 며, 연속 하위 문자열 중 01 개의 숫자 가 같은 하위 문자열 의 개 수 를 찾 아야 합 니 다.만약 서로 다른 위치 에 나타 난 하위 문자열 이 있다 면, 다시 계산 하지 마 세 요.
    문제 풀이 방법
    방법 1: 폭력 해법 (TLE)
    s 의 길이 가 그렇게 큰 것 을 보 니 폭력 해법 이 시간 을 초과 할 것 같 습 니 다. 과연 시간 을 초과 한 것 같 습 니 다.하지만 방법 은 간단 하 다. 각 위치 부터 뒤로 세 고 0 까지 세 는 개수 와 1 의 개수 가 같 을 때 멈 추 면 된다.매번 엔 딩 까지 옮 겨 다 닐 필요 가 없 기 때문에 최 악의 시간 복잡 도 는 O (N ^ 2) 이 고 가장 좋 은 시간 복잡 도 는 O (N) 입 니 다.하지만 통과 하지 못 했다.
    class Solution(object):
        def countBinarySubstrings(self, s):
            """
            :type s: str
            :rtype: int
            """
            N = len(s)
            res = 0
            for i in range(N):
                c1, c0 = 0, 0
                if s[i] == "1":
                    c1 = 1
                else:
                    c0 = 1
                for j in range(i + 1, N):
                    if s[j] == "1":
                        c1 += 1
                    else:
                        c0 += 1
                    if c0 == c1:
                        res += 1
                        break
            return res
    

    방법 2: 연속 하위 문자열 계산
    우선 연속 적 인 0, 1 의 개수 가 얼마나 되 는 지 세 어 보 세 요.예 를 들 어 “0110001111” 의 연속 0 과 1 의 개 수 는 [1, 2, 3, 4] 이다.
    그리고 우 리 는 0 과 1 의 개수 가 같은 하위 문자열 을 구하 고 싶 기 때문에 하나의 교차 가 필요 하 다. 인접 한 두 개의 수의 최소 치 를 찾 으 면 된다.예 를 들 어 “0001111” 결 과 는 min(3, 4) = 3, 즉 ("01", "0011", "000111") 이다.
    무슨 일리 가 있 습 니까?문자열 이 나타 나 는 배열 을 구 했 기 때문에 모든 위 치 는 0, 1 이 교차 하 는 하위 문자열 의 길이 일 것 입 니 다.그렇지 않 으 면 인접 한 0 이나 1 은 더 긴 길이 로 맞 출 수 있다.그래서 우리 가 마지막 으로 교차 하 는 최소 값 을 구 하 는 것 은 인접 문자열 의 0 과 1 의 길 이 를 얻 는 것 이다.
    위의 사고방식 에 따라 이 코드 를 쓸 수 있다.
    class Solution(object):
        def countBinarySubstrings(self, s):
            """
            :type s: str
            :rtype: int
            """
            N = len(s)
            curlen = 1
            res = []
            for i in range(1, N):
                if s[i] == s[i - 1]:
                    curlen += 1
                else:
                    res.append(curlen)
                    curlen = 1
            res.append(curlen)
            return sum(min(x, y) for x, y in zip(res[:-1], res[1:]))
    

    위의 코드 는 더욱 간결 하 게 쓸 수 있다.
    class Solution(object):
        def countBinarySubstrings(self, s):
            """
            :type s: str
            :rtype: int
            """
            s = map(len, s.replace('01','0 1').replace('10','1 0').split())
            return sum(min(i, j) for i,j in zip(s, s[1:]))
    

    날짜.
    2018 년 1 월 27 일 2018 년 11 월 10 일 - 빼 빼 로 데 이 즐 기기

    좋은 웹페이지 즐겨찾기