387. 문자열 의 첫 번 째 유일한 문자
1738 단어 LeetCode 알고리즘 JS 구현
예시
s = "leetcode"
0.
s = "loveleetcode",
2.
코드:
이 문 제 를 다 읽 은 후에 알 아야 합 니 다. 이 문제 의 시간 복잡 도가 가장 작은 것 도 O (n) 입 니 다. 전체 문자열 을 옮 겨 다 니 기만 하면 그 문자열 이 첫 번 째 중복 되 지 않 는 문자열 이라는 것 을 알 수 있 기 때 문 입 니 다.
사고방식: 반환 이 존재 하지 않 습 니 다. - 1 에 대응 하 는 색인 이 존재 합 니 다. 그러면 이 두 가지 상황 을 분리 합 니 다.
1. 첫 번 째 는 0 을 되 돌려 주 는 빈 문자열 '' 과 'aabb' 빈 문자열 이 존재 하지 않 습 니 다. 알고리즘 을 시작 할 때 한 번 판단 하면 해결 할 수 있 습 니 다.두 번 째 "aabb" 는 우 리 는 그것 을 두 번 째 상황 으로 돌려 판단 한다.
2. 두 번 째, 우 리 는 대상 hashObj 가 문자열 을 옮 겨 다 닐 때 hashObj 에 이 문자 가 존재 하 는 지 판단 하고 존재 하지 않 으 면 이 위치의 색인 + 1 을 넣 습 니 다.(왜 1 을 추가 합 니까? 첫 번 째 문 자 는 대상 에 존재 하지 않 기 때 문 입 니 다. 대상 은 0 이라는 색인 을 저장 합 니 다. 그러나 색인 0 은 다음 판단 에서 Boolean 이 fasle 로 변환 합 니 다. 그러면 그 는 존재 하지 않 습 니 다. 그러면 이 문 자 는 다시 할당 됩 니 다)
존재 한다 면 이 위치의 값 을 - 2 (- 2 또는 기타 모두 가능 합 니 다. - 2 는 이 문자 가 중복 되 는 표지 일 뿐 판단 을 false 로 바 꿀 수 있 는 값 은 안 됩 니 다) 로 바 꿉 니 다.
옮 겨 다 니 기 가 끝 난 후, 이때 hashObj 를 옮 겨 다 니 며, 첫 번 째 는 - 2 가 아 닌 값 을 찾 았 습 니 다. 이 값 을 되 돌려 주 는 것 이 색인 입 니 다.
/**
* @param {string} s
* @return {number}
*/
var firstUniqChar = function(s) {
let hashObj = {}
let b //
if (s == "") {
b = -1
}
for (let i = 0; i < s.length; i++) {
if (hashObj[s[i]] && hashObj[s[i]] != -2) {
hashObj[s[i]] = -2
} else if (hashObj[s[i]] != -2) {
hashObj[s[i]] = i + 1
}
}
for (let item in hashObj) {
if (hashObj[item] != -2) {
b = (hashObj[item]) - 1
break;
} else {
b = -1
}
}
return b
};