소문자로 된 문자열이 있고 비용이라는 음수가 아닌 값의 목록도 있다고 가정하고 문자열과 목록의 길이는 같습니다. costcosts[i]에 대한 문자 s[i]를 삭제할 수 있으며, 그런 다음 s[i]와 cost[i]가 모두 제거됩니다. 연속적으로 반복되는 모든 문자를 삭제하기 위한 최소 비용을 찾아야 합니다.
따라서 입력이 s ="xxyyx" nums =[2, 3, 10, 4, 6]과 같으면 총 비용에 대해 s[0]과 s[3]을 삭제할 수 있으므로 출력은 6이 됩니다. 2 + 4 =6.
이 문제를 해결하기 위해 다음 단계를 따릅니다.
-
하나의 스택 정의
-
비용 :=0
-
initialize i :=0의 경우 i
-
st의 크기가 0이 아니고 s[top of st]가 s[i]와 같은 경우:
-
nums[top of st]> nums[i]인 경우:
-
비용 :=비용 + 숫자[i]
-
-
그렇지 않으면:
-
비용 :=비용 + 숫자[최상위]
-
st
의 팝 요소 -
i를 st로 푸시
-
-
-
그렇지 않으면
-
i를 st로 푸시
-
-
-
반품 비용
더 나은 이해를 위해 다음 구현을 살펴보겠습니다.
예시
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int solve(string s, vector<int>& nums) {
stack<int> st;
int cost = 0;
for (int i = 0; i < s.size(); ++i) {
if (st.size() && s[st.top()] == s[i]) {
if (nums[st.top()] > nums[i]) {
cost += nums[i];
} else {
cost += nums[st.top()];
st.pop();
st.push(i);
}
} else {
st.push(i);
}
}
return cost;
}
};
int solve(string s, vector<int>& nums) {
return (new Solution())->solve(s, nums);
}
main(){
vector<int> v = {2, 3, 10, 4, 6};
string s = "xxyyx";
cout << solve(s, v);
} 입력
"xxyyx",{2,3,10,4,6} 출력
6