一、字符串查找
1.题目描述: 给定一个字符串A,要求在A中查找一个子串B。
如 :A="ABCDF",要你在A中查找子串B=“CD”。
2.分析:
相当于实现 strstr 库函数。
3.解法:
(1):时间复杂度O(n*m) 双层循环依次比较
/*
* Quick_sort
* */
package string_contains;
public class Quick_Sort {
public static void main(String[] args){
int[] data={2,25,9,511,2,6,7,8,0,222,25};
System.out.println("Begin:");
quickSort(data,0,data.length-1);
for(int a:data)
System.out.print(" "+a);
}
/* public static int partition_1(int[] data,int low,int high){
//以最后一个元素为主元
int key=data[high];
int i=low-1;
for(int j=low;j<high;j++){
if(data[j]<key){
i=i+1;
//交换
int temp=data[j];
data[j]=data[i];
data[i]=temp;
}
}
//交换
int temp=data[i+1];
data[i+1]=data[high];
data[high]=temp;
return i+1;
}*/
public static int partition_2(int[] data,int low,int high){
int key=data[low];
int l=low-1;
int h=high+1;
while(true){
do{
h--;
}while(data[h]>key);
do{
l++;
}while(data[l]<key);
if(l<h){
//交换
int temp=data[l];
data[l]=data[h];
data[h]=temp;
}
else{
return h;
}
}
}
public static int partition_3(int[] data,int low,int high){
//以第一个元素为主元
int key=data[low];
int l=low;
int h=high;
while(l<h){
while(data[h]>key && l<h)
h--;
data[l]=data[h];
while(data[l]<key && l<h)
l++;
data[h]=data[l];
}
data[l]=key;
return l;
}
public static int partition_4(int[] data,int low,int high){
//以第一个元素为主元
int key=data[low];
int l=low;
int h=high;
while(l<h){
while(key<=data[h] && l<h)
h--;
data[l]=data[h];
while(key>=data[l] && l<h)
l++;
data[h]=data[l];
}
data[l]=key;
return l;
}
public static void quickSort(int[] data,int low,int high){
if(low<high){
System.out.println("Begin1:");
int p=partition_4(data,low,high);
//System.out.println("Begin2:");
quickSort(data,low,p-1);
quickSort(data,p+1,high);
}
}
}
(2):时间复杂度O(n+m) KMP算法