L1-判断字符串是否没有重复字符

实现一个算法确定字符串中的字符是否均唯一出现

样例
给出”abc”,返回 true

给出”aab”,返回 false

法一

两层for循环 遍历后面的字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Solution {
/*
* @param str: A string
* @return: a boolean
*/
public boolean isUnique(String str) {
// write your code here
if(str == null){
throw new IllegalArgumentException("invalid parameters");
}
//如果str的长度是0或者1,那么没有重复字符,返回true
if(str.length() == 0 || str.length() == 1){
return true;
}
boolean flag=true;
for(int i=0;i<str.length()-1;i++)
{
for(int j=i+1;j<str.length();j++)
{
if(str.charAt(i)==str.charAt(j))
flag=false;
}
}
return flag;
}
}

法二

哈希表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Solution {
/*
* @param str: A string
* @return: a boolean
*/
public boolean isUnique(String str) {
// write your code here
if(str == null){
throw new IllegalArgumentException("invalid parameters");
}
//如果str的长度是0或者1,那么没有重复字符,返回true
if(str.length() == 0 || str.length() == 1){
return true;
}



HashSet<Character> hs=new HashSet<Character>();
for(int i=0;i<str.length();i++)
{
if(hs.contains(str.charAt(i)))
return false;
hs.add(str.charAt(i));
}
return true;
}
}

法三

将字符串转成字符数组,遍历数组,看当前字符是否和后面字符相同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Solution {
/*
* @param str: A string
* @return: a boolean
*/
public boolean isUnique(String str) {
// write your code here
if(str == null){
throw new IllegalArgumentException("invalid parameters");
}
//如果str的长度是0或者1,那么没有重复字符,返回true
if(str.length() == 0 || str.length() == 1){
return true;
}

char[] ch = str.toCharArray();
Arrays.sort(ch);
for(int i=0;i<ch.length-1;i++)
{
if(ch[i]==ch[i+1])
return false;
}
return true;
}
}

法四

调用string.idexof(value)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Solution {
/*
* @param str: A string
* @return: a boolean
*/
public boolean isUnique(String str) {
// write your code here
if(str == null){
throw new IllegalArgumentException("invalid parameters");
}
//如果str的长度是0或者1,那么没有重复字符,返回true
if(str.length() == 0 || str.length() == 1){
return true;
}


for(int i=0;i<str.length()-1;i++)
{
if(str.indexOf(str.charAt(i),i+1)!=-1)
//stringObject.indexOf(searchvalue,fromindex)
//如果要检索的字符串值没有出现,则该方法返回 -1。
return false;
}
return true;
}
}

补充:Java中字符串为什么不以\0结尾

Java里面一切都是对象,是对象的话,字符串肯定就有长度,即然有长度,编译器就可以确定要输出的字符个数,当然也就没有必要去浪费那1字节的空间用以标明字符串的结束了。
Java中:

char []str=”test”;//编译都通不过

char []str=new char[10];//这样才行,也就是直接指定了其大小

在java中数组其实就是一个对象,学习java时,我们都接触的一句话就是everythingis object,因此数组也不例外,数组对象里还有一个属性叫做length,就是数组的长度,因此对于输出函数来说,有直接的大小可以判断字符串的边界,编译器就没必要再去浪费一个空间标识字符串的结束。

参考链接:http://844604778.iteye.com/blog/1959495

https://blog.csdn.net/upupday19/article/details/78975457