剑指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 }

 

posted @ 2019-09-09 09:53  chyblogs  阅读(128)  评论(0)    收藏  举报