JZ34 第一个只出现一次的字符
JZ34 第一个只出现一次的字符
问题描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
输入:“google”
返回值:4
问题分析
一个字符串要找某个特定的字符,就应该化成字符数组。用每一个字符和其他的字符进行比较,只要出现重复就跳出循环比较下一个,如果出现一个字符和其他字符都没有出现重复,这个字符就是所需的字符。但是这个算法(解法一)的时间复杂度太高。
因此,我对此进行优化,想到了一种类似hash表一样的算法。先遍历一次字符数组,创建一个数组record来记录每个字符出现的次数。再遍历一次字符数组,如果字符在数组record中的记录为一,则返回该字符。
解法一(时间复杂度:O(n^2))
public class Solution {
public int FirstNotRepeatingChar(String str) {
if(str==null||str.length()==0)return -1;
char[] chars = str.toCharArray();
int index=-1;
for (int i=0;i<chars.length;i++){
boolean flag=false;
for (int j=0;j<chars.length;j++){
if (i!=j){
if (chars[i]==chars[j]){
flag=true;
break;
}
}
}
if (!flag){
index=i;
break;
}
}
return index;
}
}
解法二
public class Solution {
public int FirstNotRepeatingChar(String str) {
if(str==null||str.length()==0)return -1;
char[] chars = str.toCharArray();
int[] record=new int[58];
for (char c:chars){
record[(int)c-65]++;
}
for (int i=0;i<chars.length;i++){
if (record[(int)chars[i]-65]==1){
return i;
}
}
return -1;
}
}