题目描述:
判断一个字符串是否包含字符串。
分析:
方法一:蛮力法:
最简单的方法就是把这个字符串看作一个字符串数组,对该数组使用双循环进行遍历,即对每个字符,都将这个字符与后面所有的字符进行比较,如果能找到相同的字符,则说明字符串包含有重复的字符。
实现代码:
package lock;
public class T13 {
public static boolean isDup(String str)
{
int len =str.length();
int i;
for(i=0;i<len;i++)
{
for(int j=i+1;j<len;j++)
{
if(str.charAt(j)==str.charAt(i))
return true;
}
}
return false;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String str="never";
boolean result=isDup(str);
if(result)
System.out.println(str+"中有重复字符");
else
System.out.println(str+"中没有重复的字符");
}
}
程序的运行结果为:
算法性能分析:
由于这种方法使用了双循环对字符数组进行遍历,因此,算法的时间复杂度为O(N^2)(其中,N是指的字符串的长度)。
方法二:空间转换时间
在算法中经常会采用空间换时间的方法。由于常见的字符只有256个,可以假设这个题目涉及的字符串中不同的字符串最多为256个,那么可以申请一个大小为256的int类型数组来记录每个字符出现的次数,初始化都为0,那么把这个字符的编码作为数组的代表,在遍历字符数组时,如果这个字符出现的次数为0,那么把它置为1。如果为1,则说明这个字符串已经在前面出现过,因此字符串包含重复的字符串。采用这种方法止血药对数组进行一次遍历就可以。
实现代码:
package lock;
public class T14 {
public static boolean isDup(String str)
{
int len=str.length();
int[] flags=new int[8]; //只需要8个32位的int,8*32位=256位
int i;
for(i=0;i<8;i++)
flags[i]=0;
for(i=0;i<len;i++)
{
int index=(int)str.charAt(i)/32;
int shift=(int)str.charAt(i)%32;
if((flags[index]&(1<<shift))!=0)
return true;
flags[index]|=(1<<shift);
}
return false;
}
public static void main(String[] args) {
String str="never";
boolean result=isDup(str);
if(result)
System.out.println(str+"中有重复字符");
else
System.out.println(str+"中没有重复的字符");
}
}
运行结果:
算法分析:
由于这种方法对字符串进行了一次遍历,因此,算法的时间复杂度为O(N)。(其中,N是指的字符串的长度)。此外这种方法申请了8个额外的存储空间。