JZ34 第一个只出现一次的字符位置
题目描述:
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
示例:
输入:
"google"
返回值:
4
题解:
方法一:哈希法
1.思路:
第一次遍历记录下每个字符出现的次数。
第二次遍历找到第一次出现一次的字符,并记录位置。
2.复杂度:
时间复杂度:O(2n)
空间复杂度:O(n)
3.代码
public class Solution {
public int FirstNotRepeatingChar(String str) {
int len = str.length();
if(len == 0)
return -1;
//存储字符出现次数,为了简单直接定义256个
int[] count = new int[256];
int ans=-1;
for(int i=0; i<len; i++){
count[str.charAt(i)]++;
}
for(int i=0; i<len; i++){
if(count[str.charAt(i)]==1)
return i;
}
return -1;
}
}
方法二:使用String类的Api
1.思路
如果该字符只出现一次,那么从前开始查找和从后开始查找,找到的下标都应该是同一个。
lastIndexOf :从后往前遍历查找对应字符串,找到对应字符串结束返回数据,返回值为int类型,返回查找字符串首个字符位置(从0开始查找),未找到返回 -1
indexOf :从前往后遍历查找对应字符串,找到对应字符串结束返回数据,返回值为int类型,返回查找字符串首个字符位置(从0开始查找),未找到返回 -1;
2.复杂度:
空间复杂度:O(1)
时间复杂度:O(
n
2
n^2
n2),每次查找一个字符都需要遍历一次字符串
3.代码
public class Solution {
public int FirstNotRepeatingChar(String str) {
// 方法二:使用String类的Api进行查找
/*
lastIndexOf :从后往前遍历查找对应字符串,找到对应字符串结束返回数据,
返回值为int类型,返回查找字符串首个字符位置(从0开始查找),未找到返回 -1
indexOf :从前往后遍历查找对应字符串,找到对应字符串结束返回数据,
返回值为int类型,返回查找字符串首个字符位置(从0开始查找),未找到返回 -1;
*/
for(int i=0; i<str.length(); i++){
char t = str.charAt(i);
if(str.indexOf(t)==i && str.lastIndexOf(t)==i)
return i;
}
return -1;
}
}