62,614
社区成员
发帖
与我相关
我的任务
分享
for (String a : s) {
x = str.indexOf(a);
y = x + a.length();
if (x >= 0) {
sba.append("[");
sba.append(x);
sba.append(",");
sba.append(y);
sba.append("]");
sba.append(",");
}
}
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
/**
* 思路:[1,3],[7,7],[5,5],[2,4] 把每个区间的两个数都保存在同一个数组里,然后排序
* 数组中不连续的位置就是分割点,例子中得到的数组是【1 2 3 4 5 5 7 7】
* 判断规则,如0不在数组,而1在数组中,所以0和1之间是个分割点,则在str[0]后面加上<b>
* 5在数组中,6不在数组中,则5和6之间是个分割点,str[5]后面加上</b>
* 添加count,奇数偶数统计判断是<b>还是</b>?
* @param args
*/
public static void main(String[] args) {
String result = "";
boolean flag = false; //标志第一位是否匹配到
String[] s = { "aba", "bab", "z", "q"};
String str = "sababqczazcqjhdzabas";
int[] arr = new int[str.length()*str.length()]; //保存区间内两个数值
int n = 0;//result 数组下标
System.out.println("匹配区间如下:");
for (int i = 0; i < s.length; i++) {
if(str.indexOf(s[i]) == 0){ //记录第一位是否匹配到,因为数组长度不确定,定义数组多余的项为0
flag = true;
}
int[] arrs = checkNum(s[i],str); //数组s的每一项匹配多次
for (int j = 0; j < arrs.length; j++) {
arr[n++] = arrs[j];
arr[n++] = arrs[j] + s[i].length() - 1;
for (int k = arrs[j]; k <= arrs[j] + s[i].length() - 1; k++) {
arr[n++] = k;
}
System.out.print("[" + arrs[j] + "," + (arrs[j] + s[i].length() - 1) + "] ");
}
}
System.out.println();
arr = removeRe(arr,flag);//去重复
Arrays.sort(arr); //排序
System.out.print("区间组成数组:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
int count = 1; //奇数<b>,偶数</b>
for (int i = 0; i < str.length(); i++) {
if(check(i,arr) && !check(i+1,arr)){
if(count%2 == 0){
result += str.charAt(i) + "</b>";
}else{
result += str.charAt(i) + "<b>";
}
count ++;
}else if(check(i,arr) && check(i+1,arr)){
result += str.charAt(i);
}else if(!check(i,arr) && check(i+1,arr)){
if(count%2 == 0){
result += str.charAt(i) + "</b>";
}else{
result += str.charAt(i) + "<b>";
}
count ++;
}else if(!check(i,arr) && !check(i+1,arr)){
result += str.charAt(i);
}
}
System.out.println("结果:" + result);
}
//去重复
private static int[] removeRe(int[] arr,boolean flag) {
Set<Integer> set = new HashSet<Integer>();
for (int i = 0; i < arr.length-1; i++) {
if(arr[i] !=0 ){
set.add(arr[i]);
}
}
Object[] obj = set.toArray();
int[] arrs;
if(flag){
arrs = new int[set.size()+1];
arrs[0] = 0;
for (int i = 0; i < obj.length; i++) {
arrs[i+1] = (Integer) obj[i];
}
}else{
arrs = new int[set.size()];
for (int i = 0; i < obj.length; i++) {
arrs[i] = (Integer) obj[i];
}
}
return arrs;
}
public static boolean check(int n, int[] arr){
for (int i = 0; i < arr.length; i++) {
if(arr[i] == n){
return true;
}
}
return false;
}
//正则表达式匹配多次
public static int[] checkNum(String s, String str){
int[] arr = new int[str.length()];
int n = 0;
Pattern pt = Pattern.compile(s);
Matcher mt = pt.matcher(str);
while (mt.find()) {
arr[n++] = mt.start();
}
return removeRe(arr,false);
}
}
运行如下:
匹配区间如下:
[16,18] [1,3] [2,4] [7,7] [9,9] [15,15] [5,5] [11,11]
区间组成数组:1 2 3 4 5 7 9 11 15 16 17 18
结果:s<b>ababq</b>c<b>z</b>a<b>z</b>c<b>q</b>jhd<b>zaba</b>s
import java.util.Arrays;
public class Test {
/**
* 思路:[1,3],[7,7],[5,5],[2,4] 把每个区间的两个数都保存在同一个数组里,然后排序
* 数组中不连续的位置就是分割点,例子中得到的数组是【1 2 3 4 5 5 7 7】
* 判断规则,如0不在数组,而1在数组中,所以0和1之间是个分割点,则在str[0]后面加上<b>
* 5在数组中,6不在数组中,则5和6之间是个分割点,str[5]后面加上</b>
* 添加count,奇数偶数统计判断是<b>还是</b>?
* @param args
*/
public static void main(String[] args) {
String result = "";
String[] s = { "aba", "bab", "z", "q" };
String str = "sababqczac";
int[] arr = new int[2*s.length]; //保存区间内两个数值
int n = 0;//result 数组下标
System.out.println("匹配区间如下:");
for (int i = 0; i < s.length; i++) {
int index = str.indexOf(s[i]);
arr[n++] = index;
arr[n++] = index + s[i].length() - 1;
System.out.print("[" + index + "," + (index + s[i].length() - 1) + "] ");
}
System.out.println();
Arrays.sort(arr); //排序
System.out.print("区间组成数组:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
int count = 1; //奇数<b>,偶数</b>
for (int i = 0; i < str.length(); i++) {
if(check(i,arr) && !check(i+1,arr)){
if(count%2 == 0){
result += str.charAt(i) + "</b>";
}
count ++;
}else if(check(i,arr) && check(i+1,arr)){
result += str.charAt(i);
}else if(!check(i,arr) && check(i+1,arr)){
if(count%2 != 0){
result += str.charAt(i) + "<b>";
}
count ++;
}else if(!check(i,arr) && !check(i+1,arr)){
result += str.charAt(i);
}
}
System.out.println("结果:" + result);
}
public static boolean check(int n, int[] arr){
for (int i = 0; i < arr.length; i++) {
if(arr[i] == n){
return true;
}
}
return false;
}
}
运行:
匹配区间如下:
[1,3] [2,4] [7,7] [5,5]
区间组成数组:1 2 3 4 5 5 7 7
结果:s<b>ababq</b>c<b>z</b>ac
缺点:这种思路只能完成String[] s = { "aba", "bab", "z", "q" };每个匹配一次,如果每个项出现多次,就不能这样做了