942. 增减字符串匹配
给定只含 “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]
示例 1:
输入:“IDID”
输出:[0,4,1,3,2]
示例 2:
输入:“III”
输出:[0,1,2,3]
示例 3:
输入:“DDI”
输出:[3,2,0,1]
快捷键目录标题文本样式列表链接代码片表格注脚注释自定义列表LaTeX 数学公式插入甘特图插入UML图插入Mermaid流程图插入Flowchart流程图插入类图
解题思路:
这道题主要考察的是找规律,根据输出结果可以发现:依次遍历给定字符串,如果是“I”,则从最小值开始,每次遍历到“I”则依次加1;如果是“D”,则从最小值开始,每次遍历到“D”则依次减1。因为数组长度比字符串多1,最后别忘记把最后一个元素填充上。
class Solution {
public int[] diStringMatch(String s) {
int i=0;
int N = S.length();
int a[] = new int [N+1];
for(int k=0;k<N;k++){
if(s.charAt(k) == 'I'){
a[k] = i;
i++;
}
else{
a[k] = N;
N--;
}
}
a[N] = i;//参与内部运算
return a;
}
}
附加:不同子串
一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成 的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共 7 个。 注意在计算时,只算本质不同的串的个数。 请问,字符串0100110001010001 有多少个不同的非空子串。
解题思路:
1.用substring方法提取子字符串
2.用set集合去重
import java.util.HashSet;
import java.util.Set;
//审题发现要求是不同的非空子串,则想到Set集合去重,
//String.substring()方法求子串(一切 为快速解题为前提)
//for循环每一种可能
public class butongzichuan {
public static void main(String[] args) {
String s ="0100110001010001";
Set<String> set = new HashSet<String>();
for (int i = 0; i < s.length(); i++) {
for (int j = i+1; j <= s.length(); j++) {
String a = s.substring(i,j);
set.add(a);
}
}
System.out.println(set.size());
}