0942.增减字符串匹配
描述
给定只含 "I"(增大)或 "D"(减小)的字符串 S ,令 N = S.length。
返回 [0, 1, ..., N] 的任意排列 A 使得对于所有 i = 0, ..., N-1,都有:
- 如果
S[i] == "I",那么A[i] < A[i+1] - 如果
S[i] == "D",那么A[i] > A[i+1]
实例
输出:"IDID"
输出:[0,4,1,3,2]
输出:"III"
输出:[0,1,2,3]
输出:"DDI"
输出:[3,2,0,1]
提示
1 <= S.length <= 1000S只包含字符"I"或"D"。
题解
题目有点问题
对于每一个输入并不是只有唯一解
对于IDID而言,实例的输出[0,4,1,3,2]和我的算法给的答案[0,2,1,4,3]都满足条件
还是一个全排列问题,通过交换数组元素实现全排列,排列时检测当前的排列方式是否符合要求,不符合则结束.
public int[] diStringMatch(String S) {
int[] state = new int[S.length()+1];
for (int i = 0; i < state.length; i++)
state[i] = i;
int[] res = allPoss4_942(0,state,S);
return res;
}
public int[] allPoss4_942(int changeIndex,int[] state,String s){
if (changeIndex > 1){
if (s.charAt(changeIndex-2) == 'I'){
if (state[changeIndex-2] > state[changeIndex-1])
return null;
} else {
if (state[changeIndex-2] < state[changeIndex-1])
return null;
}
}
if (changeIndex == state.length){
return state;
}
for (int i=changeIndex;i<state.length;i++){
swap(state,changeIndex,i);
int[] res = allPoss4_942(changeIndex+1,state,s);
if (res != null)
return res;
swap(state,changeIndex,i);
}
return null;
}
public static void swap(int[] nums,int i,int j){
if (i == j)
return;
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
本文探讨了0942.增减字符串匹配问题,详细介绍了如何通过全排列和元素交换来寻找符合特定I(增大)或D(减小)模式的数列。通过具体实例演示了算法过程,包括对输入字符串IDIDIIIDDI的处理,展示了多种可能的解决方案。
223

被折叠的 条评论
为什么被折叠?



