주제 주소
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;
}
};