java—字符流中的第一个非重复字符

zsohkypk  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(445)

这个问题要求我们找到新的字符串b。
b的格式是这样的,每次将一个字符插入到流中时,我们都必须找到第一个非重复字符,并将其附加到b的末尾。如果未找到非重复字符,则在b的末尾追加“#”。

  1. Example:
  2. "a" - first non repeating character 'a'
  3. "ab" - first non repeating character 'a'
  4. "aba" - first non repeating character 'b'
  5. "abad" - first non repeating character 'b'
  6. "abadb" - first non repeating character 'd'
  7. "abadbc" - first non repeating character 'd'

有人能帮我找出我的代码哪里出错了吗。我的逻辑是使用string的substring函数,找到唯一的字符并将其添加到arraylist,然后打印整个arraylist。

  1. public class Solution
  2. {
  3. public String solve(String A)
  4. {
  5. ArrayList<Character>a=new ArrayList<Character>();
  6. String res="";
  7. for(int i=0;i<A.length();i++)
  8. {
  9. String ss=A.substring(0,i+1);
  10. String ue=uniqueCharacters(ss);
  11. // System.out.println(ue);
  12. if(ue!="") a.add(ue.charAt(0));
  13. else a.add('#');
  14. }
  15. for(Character j:a) res+=j;
  16. return res;
  17. }
  18. public static String uniqueCharacters(String test)
  19. {
  20. String temp = "";
  21. for (int i = 0; i < test.length(); i++)
  22. {
  23. char current = test.charAt(i);
  24. if (temp.indexOf(current) < 0) temp = temp + current;
  25. else temp = temp.replace(String.valueOf(current), "");
  26. }
  27. return temp;
  28. }
  29. }
p1tboqfb

p1tboqfb1#

当您第二次遇到字符时,您将其从唯一字符(1)中删除,但如果该字符有第三个字符,则会再次添加该字符(2)。

  1. public static String uniqueCharacters(String test)
  2. {
  3. String temp = "";
  4. for (int i = 0; i < test.length(); i++)
  5. {
  6. char current = test.charAt(i);
  7. if (temp.indexOf(current) < 0) temp = temp + current; <---- (2)
  8. else temp = temp.replace(String.valueOf(current), ""); <----- (1)
  9. }
  10. return temp;
  11. }

solution count计算字符数,然后仅返回计数为1(一)的字符数。

k3bvogb1

k3bvogb12#

最好是使用 Set 使用的结果检测输入字符串中的唯一字符 Set::add 返回 false 如果未向集合中实际添加任何元素 Queue 保持非重复字符。
当检测到重复(非唯一)字符时,会将其从队列中删除,如有必要, "#" 作为占位符应用。如果检测到一个唯一的字符,它将被添加到队列中。
实施示例:

  1. public static String solve(String str) {
  2. // verify the input
  3. if (null == str || str.isEmpty()) {
  4. return str;
  5. }
  6. Set<Character> previous = new LinkedHashSet<>();
  7. Queue<Character> nonRepeated = new LinkedList<>();
  8. StringBuilder sb = new StringBuilder();
  9. // use the first character
  10. char curr = str.charAt(0);
  11. previous.add(curr);
  12. nonRepeated.add(curr);
  13. sb.append(curr);
  14. for (int i = 1, n = str.length(); i < n; i++) {
  15. char c = str.charAt(i);
  16. if (!previous.add(c)) { // duplicate character found
  17. nonRepeated.remove(c);
  18. if (nonRepeated.isEmpty()) {
  19. curr = '#';
  20. } else { // get the next non-repeated character
  21. curr = nonRepeated.peek();
  22. }
  23. } else { // unique element is detected
  24. if (curr == '#') {
  25. curr = c;
  26. }
  27. nonRepeated.add(c);
  28. }
  29. sb.append(curr);
  30. }
  31. return sb.toString();
  32. }

测验:

  1. for (String t : Arrays.asList("abadbc", "abcdba", "aaabbbacab")) {
  2. System.out.printf("input: %s --> %s%n----%n", t, solve(t));
  3. }

输出:

  1. input: abadbc --> aabbdd
  2. ----
  3. input: abcdba --> aaaaac
  4. ----
  5. input: aaabbbacab --> a##b###ccc
  6. ----
展开查看全部

相关问题