문제 링크
www.hackerrank.com/challenges/special-palindrome-again/problem
A string is said to be a special string if either of two conditions is met:
- All of the characters are the same, e.g. aaa.
- All characters except the middle one are the same, e.g. aadaa.
A special substring is any substring of a string which meets one of those criteria. Given a string, determine how many special substrings can be formed from it.
Example
s = mnonopoo
s contains the following special substrings: {m, n, o, n, o, p, o, o, non, ono, opo, oo}.
Function Description
Complete the substrCount function in the editor below.
substrCount has the following parameter(s):
- int n: the length of string s
- string s: a string
Returns
- int: the number of special substrings
Input Format
The first line contains an integer n, , the length of s.
The second line contains the string s.
Constraints
1 <= n <= 10^6
Each character of the string is a lowercase English letter, ascii[a-z] .
문제 해석
주어진 문자열의 sub string 중, 가운데 문자를 제외한 나머지 문자가 모두 같은 sub string의 개수를 구하는 문제.
간단하게 시작 문자열을 잡고 그 다음 문자를 바꿔가며 하나씩 개수를 세어주면 되는 듯 하다. 이중 for문이 되겠지?
중간 문자열을 만났는지 flag 하나 두어서 체크하기!
이중 for문 안쓰고 할 수 있는 방법이 있는지 생각해 보기 (?)
제출 코드
// Complete the substrCount function below.
static long substrCount(int n, String s) {
long result = n;
char[] sCharArray = s.toCharArray();
for (int i = 0; i < n - 1; i++) {
int sameCnt = 1;
boolean turnFlag = false;
char start = sCharArray[i];
for (int j = i + 1; j < n; j++) {
if (start == sCharArray[j]) {
if (turnFlag) {
sameCnt--;
if (sameCnt == 0) {
result++;
break;
}
}
else {
sameCnt++;
result++;
}
}
else {
if (turnFlag) break;
else turnFlag = true;
}
}
}
return result;
}
+
아래는 해커랭크에서 따봉을 가장 많이 받은 Python코드를 Java로 작성한 답안입니다 :)
// Complete the substrCount function below.
static long substrCount(int n, String s) {
List<Character> charArray = new ArrayList<>();
List<Integer> countArray = new ArrayList<>();
char[] sCharArray = s.toCharArray();
char spot = sCharArray[0];
int count = 1;
for(int i = 1; i < n; i++) {
if (spot == sCharArray[i]) count++;
else {
charArray.add(spot);
countArray.add(count);
spot = sCharArray[i];
count = 1;
}
}
charArray.add(spot);
countArray.add(count);
long result = 0;
for (int i = 0; i < charArray.size(); i++) {
Integer value = countArray.get(i);
result += ((value * (value + 1)) / 2);
}
for (int i = 1; i < charArray.size() - 1; i++) {
if ((charArray.get(i - 1) == charArray.get(i + 1)) && countArray.get(i) == 1) {
result += min(countArray.get(i - 1), countArray.get(i + 1));
}
}
return result;
}
어떻게 더 빠르게 할 수 있을까..
이중 for문은 웬만해서 쓰고 싶지 않은데 써부러따 ㅜㅜ
- mushroong
'공부이야기 > Algorithm' 카테고리의 다른 글
[자료구조] 힙(Heap)이란? (0) | 2021.11.16 |
---|---|
[LeetCode][Greedy] 55. Jump Game (0) | 2021.10.04 |
[HackerRank][String Manipulation] Sherlock and the Valid String (0) | 2021.04.23 |
[Programmers][RegEx] 2021 KAKAO BLIND RECRUITEMENT - 신규 아이디 추천 (0) | 2021.04.22 |
[LeetCode][Back Tracking] 39. Combination Sum (0) | 2021.04.17 |
댓글