题目
请实现一个算法,确定一个字符串的所有字符是否全部不同。这里我们要求不允许使用额外的存储结构。
给定一个String iniString,请返回一个bool值,True代表所有字符全部不同,False代表存在相同的字符。保证字符串中的字符为ASCLL字符。字符串的长度小于3000。
public class Different {
public boolean checkDifferent(String iniString) {
// write code here
}
}
测试样例:
“aeiou”
返回True
“barachObama”
返回False
如题目所示这里给出两种解决方式
一、利用String.matches() + 正则的方式
public class Different {
public boolean checkDifferent(String iniString) {
// write code here
return !iniString.matches(".*(.)(.*\\1).*");
}
}
解析:
String.matches() 这个方法主要返回是否匹配指定的字符串,如果匹配则为true,否则为false。
说说这个正则:
(.) 表示一个捕获组,这里有个概念就是捕获组。
捕获组:从正则表达式左侧开始,没出现一个"("记做一个分组,分组从1开始,0表示整个表达式
\1 表示反向引用,这里出现了另外一个概念反向引用。
反向引用需要使用到分组
1、\1:表示引用第一次匹配到()括起来的部分
2、\2:表示引用第二次匹配到()括起来的部分
.:代表任意一个字符
.:代表任意一个字符后面有0个或者多个字符
(.):选择字符中任意一个字符进行复制和后面的(.\1)结合进行判断是否后面存在一个字符与它相同
(.)(.\1):匹配案例 a*a
(.)(.\1).:匹配案例a*a*
.(.)(.\1):匹配案例*a*a
.(.)(.\1).:匹配案例*a*a*
二、笨办法:取一个字符,然后在剩下的字符串中查找
public boolean checkDifferent(String iniString) {
// write code here
// return !iniString.matches(".*(.)(.*\\1).*");
for(int i = 0; i<iniString.length();i++){
if((iniString.substring(i+1)).indexOf(iniString.charAt(i)) != -1){
return false;
}
}
return true;
}
这个方法很简单,就是每次取出一个字符和后面的字符进行比较
这里需要会时候三个方法,charAt(),substring(),indexOf()
1、charAt(int index) 返回指定索引处的字符
2、substring(int beginIndex) 返回一个新的字符串,从指定的index开始
3、indexOf() 查找指定字符或者字符串中第一次出现的地方索引,未找到返回 -1