387. 문자열 의 첫 번 째 유일한 문자

첫 번 째 중복 되 지 않 는 문 자 를 찾 아 색인 을 되 돌려 주 는 문자열 을 지정 합 니 다.존재 하지 않 으 면 - 1 로 돌아 갑 니 다.
예시
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
};

좋은 웹페이지 즐겨찾기