leetcode [383] 몸값 문자 / 몸값 주, 시간에 대한 해시 정책 공간

주제 주소

https://leetcode-cn.com/problems/ransom-note/

사고

이 질문은 첫 번째 문자 내부의 두 번째 문자열 잡지로 구성 할 수없는 문자열 몸값 판사을 사용하지만, 여기 2시 1분주의하는 것입니다, 질문의 매우 분명 의미입니다.

  • 첫 번째 포인트 "몸값 쓰기 편지를 노출하지 않기 위해는 의미를 표현하는 단어를 형성하는 잡지 필요성에서 각 문자 검색"여기 잡지에 설명은 문자를 재사용 할 수 있습니다.

  • 두 번째 포인트는, "두 개의 문자열을 소문자를 포함 할 가정 할 수 있습니다." 참고 만 소문자 , 그것은 중요하다

일반 솔루션

그런 다음 다음과 같이 첫 번째 아이디어는 실제로 폭력, 루프 두, 우리가보기에 계속을 열거한다 :

// 时间复杂度: O(n^2)
// 空间复杂度:O(1)
class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        for (int i = 0; i < magazine.length(); i++) {
            for (int j = 0; j < ransomNote.length(); j++) {
                if (magazine[i] == ransomNote[j]) {
                    ransomNote.erase(ransomNote.begin() + j);
                    break;
                }
            }
        }
        if (ransomNote.length() == 0) {
            return true;
        }
        return false;
    }
};

또한 시간이 많이 소요되고 여기에 시간 복잡도가 상대적으로 높은이지만, 문자열 삭제 지우기 작업도있다, 물론,이 코드는이 질문을 가지게 될 수있다

우리는 최적의 솔루션을 생각

최적화 솔루션

주제는 소문자를하기 때문에, 우리는 또한 문자 길이 잡지에 등장하는 횟수를 기록 배열 (26)에 대한 해시 시간 전략 공간을 사용할 수 있습니다, 그 배열이 필요한 ransomNote가 포함되어 있는지 여부를 확인하기 위해 ransomNote를 사용 모든 문자.
다음과 같이 코드입니다 :

// 时间复杂度: O(n)
// 空间复杂度:O(1)
class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        int record[26] = {0};
        for (int i = 0; i < magazine.length(); i++) {
            record[magazine[i]-'a'] ++;
        }
        for (int j = 0; j < ransomNote.length(); j++) {
            record[ransomNote[j]-'a']--;
            if(record[ransomNote[j]-'a'] < 0) {
                return false;
            }
        }
        return true;
    }
};
게시 된 230 개 원래 기사 · 원 찬양 248 · 전망 260 000 +

추천

출처blog.csdn.net/youngyangyang04/article/details/104875000