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 <= 1000
S
只包含字符"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;
}