剑指offer_第一个只出现一次的字符位置
题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
方法一:使用数组或map存储然后遍历两次
1 import java.util.*; 2 public class Solution { 3 public int FirstNotRepeatingChar(String str) { 4 int Arr[] = new int[58]; 5 Arrays.fill(Arr,-1); 6 for(int i = 0;i<str.length();i++) 7 Arr[str.charAt(i)-'A']++; 8 for(int i = 0;i<str.length();i++) 9 if(Arr[str.charAt(i)-'A']==0) 10 return i; 11 return -1; 12 } 13 }
考虑到只需要找到只出现一次的字符,那么需要统计的次数信息只有 0,1,更 大,使用两个比特位就能存储这些信息
1 public int FirstNotRepeatingChar2(String str) { 2 BitSet bs1 = new BitSet(256); 3 BitSet bs2 = new BitSet(256); 4 for (char c : str.toCharArray()) { 5 if (!bs1.get(c) && !bs2.get(c)) 6 bs1.set(c); // 0 0 -> 0 1 7 else if (bs1.get(c) && !bs2.get(c)) 8 bs2.set(c); // 0 1 -> 1 1 9 } 10 for (int i = 0; i < str.length(); i++) { 11 char c = str.charAt(i); 12 if (bs1.get(c) && !bs2.get(c)) // 0 1 13 return i; 14 } 15 return -1; 16 }

浙公网安备 33010602011771号