简体   繁体   English

查找字符串中的第一个非重复字符

[英]Find the first non repeating character in a string

I m writing a method to find the first non repeating character in a string.我正在编写一种方法来查找字符串中的第一个非重复字符。 I saw this method in a previous stackoverflow question我在上一个 stackoverflow 问题中看到了这个方法

public static char findFirstNonRepChar(String input){
 char currentChar = '\0';
 int len = input.length();
 for(int i=0;i<len;i++){
    currentChar = input.charAt(i);
    if((i!=0) && (currentChar!=input.charAt(i-1)) && (i==input.lastIndexOf(currentChar))){
        return currentChar;
    }
 }
 return currentChar;
}

I came up with a solution using a hashtable where I have two for loops (not nested) where I interate through the string in one loop writing down each occurance of a letter (for example in apple, a would have 1, p would have 2, etc.) then in the second loop I interate through the hashtable to see which one has a count of 1 first.我想出了一个使用哈希表的解决方案,其中我有两个 for 循环(未嵌套),我在一个循环中遍历字符串,写下每个出现的字母(例如在苹果中,a 将有 1,p 将有 2等)然后在第二个循环中,我通过哈希表进行交互,以查看哪个首先计数为 1。 What is the benefit to the above method over what I came up with?与我想出的方法相比,上述方法有什么好处? I am new to Java does having two loops (not nested) hinder time complexity.我是 Java 新手,确实有两个循环(不是嵌套的)会阻碍时间复杂度。 Both these algorithms should have O(n) right?这两种算法都应该有 O(n) 对吗? Is there another faster, less space complexity algorithm for this question than these two solutions?对于这个问题,还有比这两个解决方案更快、空间复杂度更低的算法吗?

public class FirstNonRepeatCharFromString {

    public static void main(String[] args) {

        String s = "java";
        for(Character ch:s.toCharArray()) {
            if(s.indexOf(ch) == s.lastIndexOf(ch)) {
                System.out.println("First non repeat character = " + ch);
                break;
            }
        }
    }
}

As you asked if your code is from O(n) or not, I think it's not, because in the for loop, you are calling lastIndexOf and it's worst case is O(n) .当您询问您的代码是否来自O(n) ,我认为不是,因为在 for 循环中,您正在调用lastIndexOf并且最坏的情况是O(n) So it is from O(n^2) .所以它来自O(n^2)

About your second question: having two loops which are not nested, also makes it from O(n) .关于你的第二个问题:有两个不嵌套的循环,也使它来自O(n)

If assuming non unicode characters in your input String, and Uppercase or Lowercase characters are assumed to be different, the following would do it with o(n) and supports all ASCII codes from 0 to 255 :如果假设输入字符串中的非 unicode 字符,并且假设大写或小写字符不同,则以下将使用 o(n) 执行此操作并支持从0255所有 ASCII 代码:

public static Character getFirstNotRepeatedChar(String input) {

    byte[] flags = new byte[256]; //all is initialized by 0 

    for (int i = 0; i < input.length(); i++) { // O(n)
        flags[(int)input.charAt(i)]++ ;
    }

    for (int i = 0; i < input.length(); i++) { // O(n)
        if(flags[(int)input.charAt(i)] > 0)
            return input.charAt(i);
    }

    return null;
}

Thanks to Konstantinos Chalkias hint about the overflow, if your input string has more than 127 occurrence of a certain character, you can change the type of flags array from byte[] to int[] or long[] to prevent the overflow of byte type.感谢Konstantinos Chalkias关于溢出的提示,如果您的输入字符串中某个字符出现超过 127 次,您可以将flags数组的类型从byte[]更改为int[]long[]以防止byte类型溢出.

Hope it would be helpful.希望它会有所帮助。

The algorithm you showed is slow: it looks for each character in the string, it basically means that for each character you spend your time checking the string twice!!您展示的算法很慢:它查找字符串中的每个字符,这基本上意味着对于每个字符,您都花时间检查字符串两次!! Huge time loss.巨大的时间损失。

The best naive O(n) solution basically holds all the characters in order of insertion (so the first can be found) and maps a mutable integer to them.最好的原始 O(n) 解决方案基本上按插入顺序保存所有字符(因此可以找到第一个)并将可变整数映射到它们。 When we're done, analyzing, we go through all the entries and return the first character that was registered and has a count of 1.完成分析后,我们遍历所有条目并返回已注册且计数为 1 的第一个字符。

There are no restrictions on the characters you can use.您可以使用的字符没有限制。 And AtomicInteger is available with import java.util.concurrent.atomic.AtomicInteger .并且AtomicInteger可通过import java.util.concurrent.atomic.AtomicInteger

Using Java 8:使用 Java 8:

public static char findFirstNonRepChar(String string) {
    Map<Integer,Long> characters = string.chars().boxed()
            .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting()));
    return (char)(int)characters.entrySet().stream()
            .filter(e -> e.getValue() == 1L)
            .findFirst()
            .map(Map.Entry::getKey)
            .orElseThrow(() -> new RuntimeException("No unrepeated character"));
}

Non Java 8 equivalent:非 Java 8 等效项:

public static char findFirstNonRepChar(String string) {
  Map<Character, AtomicInteger> characters = new LinkedHashMap<>(); // preserves order of insertion.
  for (int i = 0; i < string.length(); i++) {
    char c = string.charAt(i);
    AtomicInteger n = characters.get(c);
    if (n == null) {
      n = new AtomicInteger(0);
      characters.put(c, n);
    }
    n.incrementAndGet();
  }
  for (Map.Entry<Character, AtomicInteger> entry: characters.entries()) {
    if (entry.getValue().get() == 1) {
      return entry.getKey();
    }
  }
  throw new RuntimeException("No unrepeated character");
}
import java.util.LinkedHashMap;
import java.util.Map;

public class getFirstNonRep {

public static char get(String s) throws Exception {
    if (s.length() == 0) {
        System.out.println("Fail");
        System.exit(0);
    } else {
        Map<Character, Integer> m = new LinkedHashMap<Character, Integer>();

        for (int i = 0; i < s.length(); i++) {
            if (m.containsKey(s.charAt(i))) {
                m.put(s.charAt(i), m.get(s.charAt(i)) + 1);
            } else {
                m.put(s.charAt(i), 1);
            }
        }
        for (Map.Entry<Character, Integer> hm : m.entrySet()) {
            if (hm.getValue() == 1) {
                return hm.getKey();
            }
        }
    }
    return 0;
}

public static void main(String[] args) throws Exception {

    System.out.print(get("Youssef Zaky"));

    }

 }

This solution takes less space and less time, since we iterate the string only one time.这个解决方案占用更少的空间和更少的时间,因为我们只迭代字符串一次。

Works for any type of characters.适用于任何类型的字符。

String charHolder;  // Holds 
String testString = "8uiuiti080t8xt8t";
char   testChar = ' ';
int count = 0;  

for (int i=0; i <= testString.length()-1; i++) {
    testChar = testString.charAt(i);

    for (int j=0; j < testString.length()-1; j++) {
        if (testChar == testString.charAt(j)) {
           count++;
        }
    }
    if (count == 1) { break; };
       count = 0;
}

System.out.println("The first not repeating character is " + testChar);

I accumulated all possible methods with string length 25'500 symbols:我累积了所有可能的字符串长度为 25'500 个符号的方法:

private static String getFirstUniqueChar(String line) {
    String result1 = null, result2 = null, result3 = null, result4 = null, result5 = null;
    int length = line.length();

    long start = System.currentTimeMillis();
    Map<Character, Integer> chars = new LinkedHashMap<Character, Integer>();
    char[] charArray1 = line.toCharArray();
    for (int i = 0; i < length; i++) {
        char currentChar = charArray1[i];
        chars.put(currentChar, chars.containsKey(currentChar) ? chars.get(currentChar) + 1 : 1);
    }
    for (Map.Entry<Character, Integer> entry : chars.entrySet()) {
        if (entry.getValue() == 1) {
            result1 = entry.getKey().toString();
            break;
        }
    }
    long end = System.currentTimeMillis();
    System.out.println("1st test:\n    result: " + result1 + "\n    time: " + (end - start));

    start = System.currentTimeMillis();
    for (int i = 0; i < length; i++) {
        String current = Character.toString(line.charAt(i));
        String left = line.substring(0, i);
        if (!left.contains(current)) {
            String right = line.substring(i + 1);
            if (!right.contains(current)) {
                result2 = current;
                break;
            }
        }
    }
    end = System.currentTimeMillis();
    System.out.println("2nd test:\n    result: " + result2 + "\n    time: " + (end - start));

    start = System.currentTimeMillis();
    for (int i = 0; i < length; i++) {
        char currentChar = line.charAt(i);
        if (line.indexOf(currentChar) == line.lastIndexOf(currentChar)) {
            result3 = Character.toString(currentChar);
            break;
        }
    }
    end = System.currentTimeMillis();
    System.out.println("3rd test:\n    result: " + result3 + "\n    time: " + (end - start));

    start = System.currentTimeMillis();
    char[] charArray4 = line.toCharArray();
    for (int i = 0; i < length; i++) {
        char currentChar = charArray4[i];
        int count = 0;
        for (int j = 0; j < length; j++) {
            if (currentChar == charArray4[j] && i != j) {
                count++;
                break;
            }
        }
        if (count == 0) {
            result4 = Character.toString(currentChar);
            break;
        }
    }
    end = System.currentTimeMillis();
    System.out.println("4th test:\n    result: " + result4 + "\n    time: " + (end - start));

    start = System.currentTimeMillis();
    for (int i = 0; i < length; i++) {
        char currentChar = line.charAt(i);
        int count = 0;
        for (int j = 0; j < length; j++) {
            if (currentChar == line.charAt(j) && i != j) {
                count++;
                break;
            }
        }
        if (count == 0) {
            result5 = Character.toString(currentChar);
            break;
        }
    }
    end = System.currentTimeMillis();
    System.out.println("5th test:\n    result: " + result5 + "\n    time: " + (end - start));

    return result1;
}

And time results (5 times):和时间结果(5次):

1st test:
    result: g
    time: 13, 12, 12, 12, 14
2nd test:
    result: g
    time: 55, 56, 59, 70, 59
3rd test:
    result: g
    time: 2, 3, 2, 2, 3
4th test:
    result: g
    time: 3, 3, 2, 3, 3
5th test:
    result: g
    time: 6, 5, 5, 5, 6
public static char NonReapitingCharacter(String str) {
        Set<Character> s = new HashSet();
        char ch = '\u0000';
        for (char c : str.toCharArray()) {
            if (s.add(c)) {
                
                if (c == ch) {
                    break;
                } else {
                    ch = c;
                }
            }
        }
        return ch;
    }

Okay I misread the question initially so here's a new solution.好的,我最初误读了这个问题,所以这是一个新的解决方案。 I believe is this O(n).我相信这是 O(n)。 The contains(Object) of HashSet is O(1), so we can take advantage of that and avoid a second loop. HashSetcontains(Object)是 O(1),因此我们可以利用它并避免第二个循环。 Essentially if we've never seen a specific char before, we add it to the validChars as a potential candidate to be returned.基本上,如果我们以前从未见过特定的char ,我们会将它添加到validChars作为要返回的潜在候选对象。 The second we see it again however, we add it to the trash can of invalidChars .然而,当我们再次看到它时,我们将它添加到invalidChars的垃圾桶。 This prevents that char from being added again.这可以防止再次添加该字符。 At the end of the loop (you have to loop at least once no matter what you do), you'll have a validChars hashset with n amount of elements.在循环结束时(你必须循环至少一次,不管你做什么),你就会有一个validChars用一个HashSet n元素的量。 If none are there, then it will return null from the Character class.如果不存在,那么它将从 Character 类返回null This has a distinct advantage as the char class has no good way to return a 'bad' result so to speak.这有一个明显的优势,因为char类没有好的方法来返回“坏”结果可以这么说。

public static Character findNonRepeatingChar(String x)
{
    HashSet<Character> validChars = new HashSet<>();
    HashSet<Character> invalidChars = new HashSet<>(); 

    char[] array = x.toCharArray();
    for (char c : array)
    {
        if (validChars.contains(c))
        {
            validChars.remove(c);
            invalidChars.add(c);
        }
        else if (!validChars.contains(c) && !invalidChars.contains(c))
        {
            validChars.add(c);
        }
    }

    return (!validChars.isEmpty() ? validChars.iterator().next() : null);
}

In case of two loops (not nested) the time complexity would be O(n).在两个循环(非嵌套)的情况下,时间复杂度为 O(n)。

The second solution mentioned in the question can be implemented as:问题中提到的第二种解决方案可以实现为:

We can use string characters as keys to a map and maintain their count.我们可以使用字符串字符作为映射的键并保持它们的计数。 Following is the algorithm.下面是算法。

1.Scan the string from left to right and construct the count map. 1.从左到右扫描字符串并构建计数图。

2.Again, scan the string from left to right and check for count of each character from the map, if you find an element who's count is 1, return it. 2.再次从左到右扫描字符串并检查映射中每个字符的计数,如果找到计数为1的元素,则返回它。

package com.java.teasers.samples;  
import java.util.Map;  
import java.util.HashMap;  
public class NonRepeatCharacter {  
    public static void main(String[] args) {  
        String yourString = "Hi this is javateasers";//change it with your string  
        Map<Character, Integer> characterMap = new HashMap<Character, Integer>();  
        //Step 1 of the Algorithm  
        for (int i = 0; i < yourString.length(); i++) {  
            Character character = yourString.charAt(i);  
            //check if character is already present  
            if(null != characterMap.get(character)){  
                //in case it is already there increment the count by 1.  
                characterMap.put(character, characterMap.get(character) + 1);  
            }  
            //in case it is for the first time. Put 1 to the count  
            else  
                characterMap.put(character, 1);  
        }  
        //Step 2 of the Algorithm  
        for (int i = 0; i < yourString.length(); i++) {  
            Character character = yourString.charAt(i);  
            int count = characterMap.get(character);  
            if(count == 1){  
                System.out.println("character is:" + character);  
                break;  
            }  
        }  
    }  
}  

If you are only interested for characters in the range az (lowercase as OP requested in comments), you can use this method that requires a minimum extra storage of two bits per character Vs a HashMap approach.如果您只对 az 范围内的字符感兴趣(小写作为注释中要求的 OP),您可以使用这种方法,该方法要求每个字符至少额外存储两位,而不是 HashMap 方法。

/*
 * It works for lowercase a-z
 * you can scale it to add more characters
 * eg use 128 Vs 26 for ASCII or 256 for extended ASCII 
 */
public static char getFirstNotRepeatedChar(String input) {

    boolean[] charsExist = new boolean[26];
    boolean[] charsNonUnique = new boolean[26];

    for (int i = 0; i < input.length(); i++) {
        int index = 'z' - input.charAt(i);
        if (!charsExist[index]) {
            charsExist[index] = true;
        } else {
            charsNonUnique[index] = true;
        }
    }

    for (int i = 0; i < input.length(); i++) {
        if (!charsNonUnique['z' - input.charAt(i)])
            return input.charAt(i);
    }

    return '?'; //example return of no character found
}
public char firstNonRepeatedChar(String input) {
    char out = 0;
    int length = input.length();
    for (int i = 0; i < length; i++) {
        String sub1 = input.substring(0, i);
        String sub2 = input.substring(i + 1);
        if (!(sub1.contains(input.charAt(i) + "") || sub2.contains(input
                .charAt(i) + ""))) {
            out = input.charAt(i);
            break;
        }
    }
    return out;
}

Since LinkedHashMap keeps the order of insertion由于 LinkedHashMap 保持插入顺序

package com.company;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] argh) {
        Scanner sc = new Scanner(System.in);
        String l = sc.nextLine();
        System.out.println(firstCharNoRepeated(l));
    }

    private static String firstCharNoRepeated(String l) {
        Map<String, Integer> chars = new LinkedHashMap();
        for(int i=0; i < l.length(); i++) {
            String c = String.valueOf(l.charAt(i));
            if(!chars.containsKey(c)){
                chars.put(c, i);
            } else {
                chars.remove(c);
            }
        }
        return chars.keySet().iterator().next();
    }
}

Few lines of code, works for me.几行代码,对我有用。

public class FirstNonRepeatingCharacter {

    final static String string = "cascade";

    public static void main(String[] args) {

        char[] charArr = string.toCharArray();

        for (int i = 0; charArr.length > i; i++) {
            int count = 0;
            for (int j = 0; charArr.length > j; j++) {
                if (charArr[i] == charArr[j]) {
                    count++;
                }
            }
            if (count == 1){
                System.out.println("First Non Repeating Character is: " + charArr[i]);
                break;
            }
        }

    }
}

Constraint for this solution:此解决方案的约束:

O(n) time complexity. O(n) 时间复杂度。 My solution is O(2n), follow Time Complexity analysis,O(2n) => O(n)我的解决方案是 O(2n),按照时间复杂度分析,O(2n) => O(n)

import java.util.HashMap;

public class FindFirstNonDuplicateCharacter {
    public static void main(String args[]) {
    System.out.println(findFirstNonDuplicateCharacter("abacbcefd"));
    }

    private static char findFirstNonDuplicateCharacter(String s) {
    HashMap<Character, Integer> chDupCount = new HashMap<Character, Integer>();
    char[] charArr = s.toCharArray();
    for (char ch: charArr) { //first loop, make the tables and counted duplication by key O(n)
      if (!chDupCount.containsKey(ch)) {
        chDupCount.put(ch,1);
        continue;
      }
      int dupCount = chDupCount.get(ch)+1;
      chDupCount.replace(ch, dupCount);
    }

    char res = '-';
    for(char ch: charArr) { //second loop, get the first duplicate by count number, O(2n)
      // System.out.println("key: " + ch+", value: " + chDupCount.get(ch));
      if (chDupCount.get(ch) == 1) {
        res = ch;
        break;
      }
    }

    return res;
    } 
}

Hope it help希望有帮助

char firstNotRepeatingCharacter(String s) {
    for(int i=0; i< s.length(); i++){
        if(i == s.lastIndexOf(s.charAt(i)) && i == s.indexOf(s.charAt(i))){
            return s.charAt(i);
        }
    }
    return '_';
}
String a = "sampapl";
    char ar[] = a.toCharArray();

    int dya[] = new int[256];
    for (int i = 0; i < dya.length; i++) {
        dya[i] = -1;
    }

    for (int i = 0; i < ar.length; i++) {

        if (dya[ar[i]] != -1) {
            System.out.println(ar[i]);
           break;
        } else {
            dya[ar[i]] = ar[i];
        }
    }

This is solution in python:这是python中的解决方案:

input_str = "interesting"
#input_str = "aabbcc"
#input_str = "aaaapaabbcccq"


def firstNonRepeating(param):
    counts = {}        
    for i in range(0, len(param)):

    # Store count and index repectively
        if param[i] in counts:
            counts[param[i]][0] += 1
        else:
            counts[param[i]] = [1, i]

    result_index = len(param) - 1
    for x in counts:
        if counts[x][0] == 1 and result_index > counts[x][1]:
            result_index = counts[x][1]
    return result_index

result_index = firstNonRepeating(input_str)
if result_index == len(input_str)-1:
    print("no such character found")
else:
    print("first non repeating charater found: " + input_str[result_index])

Output:输出:

first non repeating charater found: r

  import java.util.*;
public class Main {
 public static void main(String[] args) {
  String str1 = "gibblegabbler";
  System.out.println("The given string is: " + str1);
  for (int i = 0; i < str1.length(); i++) {
   boolean unique = true;
   for (int j = 0; j < str1.length(); j++) {
    if (i != j && str1.charAt(i) == str1.charAt(j)) {
     unique = false;
     break;
    }
   }
   if (unique) {
    System.out.println("The first non repeated character in String is: " + str1.charAt(i));
    break;
   }
  }
 }
}
public class GFG {
public static void main(String[] args) {
    String s = "mmjjjjmmn";
    for (char c : s.toCharArray()) {
        if (s.indexOf(c) == s.lastIndexOf(c)) {
            System.out.println("First non repeated is:" + c);
            break;
        }
    }
}

output = n

Non Repeated Character String in Java Java中的非重复字符串

public class NonRepeatedCharacter {
     public static void main(String[] args) {
        String s = "ffeeddbbaaclck";
        for (int i = 0; i < s.length(); i++) {
             boolean unique = true;
             for (int j = 0; j < s.length(); j++) {
                 if (i != j && s.charAt(i) == s.charAt(j)) {
                     unique = false;
                     break;
                 }
              }
             if (unique) {
                 System.out.println("First non repeated characted in String \""
                 + s + "\" is:" + s.charAt(i));
                 break;
             }
         }
     }
}
Output:
First non repeated characted in String "ffeeddbbaaclck" is:l

For More Details 更多细节

In this coding i use length of string to find the first non repeating letter.在此编码中,我使用字符串长度来查找第一个非重复字母。

 package com.string.assingment3;
    import java.util.Scanner;
   public class FirstNonRepetedChar {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("Enter a String : ");
        String str = in.next();
        char[] ch = str.toCharArray();
        int length = ch.length;
        int x = length;
        for(int i=0;i<length;i++) {
            x = length-i;
            for(int j=i+1;j<length;j++) {
                if(ch[i]!=ch[j]) {
                    x--;
                }//if
            }//inner for
            if(x==1) {
            System.out.println(ch[i]);
                break;
            }
            else {
                    continue;
            }
        }//outer for
    }
}// develope by NDM

In Kotlin在科特林

 fun firstNonRepeating(string: String): Char?{
    //Get a copy of the string
    var copy = string
    //Slice string into chars then convert them to string
    string.map { it.toString() }.forEach {
        //Replace first occurrance of that character and check if it still has it
        if (copy.replaceFirst(it,"").contains(it))
        //If it has the given character remove it
            copy = copy.replace(it,"")
    }
    //Return null if there is no non-repeating character
    if (copy.isEmpty())
        return null
    //Get the first character from what left of that string
    return copy.first()
}

https://pl.kotl.in/KzL-veYNZ https://pl.kotl.in/KzL-veYNZ

   public static void firstNonRepeatFirstChar(String str) {

    System.out.println("The given string is: " + str);
    for (int i = 0; i < str.length(); i++) {
        boolean unique = true;
        for (int j = 0; j < str.length(); j++) {
            if (i != j && str.charAt(i) == str.charAt(j)) {
                unique = false;
                break;
            }
        }
        if (unique) {
            System.out.println("The first non repeated character in String is: " + str.charAt(i));
            break;
        }
    }
}

Using Set with single for loop将 Set 与单个 for 循环一起使用

public static Character firstNonRepeatedCharacter(String str) {公共静态字符 firstNonRepeatedCharacter(String str) {

Character result = null;

if (str != null) {
  Set<Character> set = new HashSet<>();
  for (char c : str.toCharArray()) {
    if (set.add(c) && result == null) {
      result = c;
    } else if (result != null && c == result) {
      result = null;
    }
  }
}
return result;

} }

You can achieve this in single traversal of String using LinkedHashSet as follows:您可以使用 LinkedHashSet 在单次遍历 String 中实现这一点,如下所示:

    public static Character getFirstNonRepeatingCharacter(String str) {
            Set<Character> result = new LinkedHashSet<>(256);
            for (int i = 0; i< str.length(); ++i) {
                if(!result.add(str.charAt(i))) {
                    result.remove(str.charAt(i));
                }
             }
            if(result.iterator().hasNext()) {
                return result.iterator().next();
             }
            return null;
        }

For Java;对于 Java;

char firstNotRepeatingCharacter(String s) {
    
    HashSet<String> hs = new HashSet<>();
    StringBuilder sb =new StringBuilder(s);
    
    for (int i = 0; i<s.length(); i++){
        char c = sb.charAt(i);
        if(s.indexOf(c) == i && s.indexOf(c, i+1) == -1 ) {
            return c;
        }
    }

    return '_';
}

public class FirstNonRepeatingChar {

    public static void main(String[] args) {
        String s = "hello world i am here";

        s.chars().boxed()
                .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting()))
                .entrySet().stream().filter(e -> e.getValue() == 1).findFirst().ifPresent(e->System.out.println(e.getKey()));

    }

}

package looping.concepts;包循环。概念;

import java.util.Scanner;导入 java.util.Scanner;

public class Line {公共类线{

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.print("Enter name: ");
    String a = sc.nextLine();
    int i = 0;
    int j = 0;

    for (i = 0; i < a.length(); i++) {
        char ch = a.charAt(i);
        int counter = 0;
        // boolean repeat = false;
        for (j = 0; j < a.length(); j++) {
            if (ch == a.charAt(j)) {
                counter++;
            }
        }
        if (counter == 1) {
            System.out.print(ch);
        }
        else
        {
            System.out.print("There is no non repeated character");
            break;
        }
    }
}

} }

import java.util.Scanner;

public class NonRepaeated1
{
  public static void main(String args[])
  {
    String str;
    char non_repeat=0;
    int len,i,j,count=0;

    Scanner s = new Scanner(System.in);
    str = s.nextLine();

    len = str.length();

    for(i=0;i<len;i++) 
    { 
      non_repeat=str.charAt(i); 
      count=1; 

      for(j=0;j<len;j++) 
      { 
        if(i!=j) 
        { 
          if(str.charAt(i) == str.charAt(j)) 
          { 
            count=0; 
            break; 
          } 
        } 
      } 

      if(count==1) 
        break; 
    } 
if(count == 1) 
System.out.print("The non repeated character is  : " + non_repeat); 

  }
}
package com.test.util;

public class StringNoRepeat {

    public static void main(String args[]) {
        String st = "234123nljnsdfsdf41l";
        String strOrig=st;
        int i=0;
        int j=0;
        String st1="";
        Character ch=' ';
        boolean fnd=false;
        for (i=0;i<strOrig.length(); i++) {


            ch=strOrig.charAt(i);
            st1 = ch.toString();

            if (i==0)
                st = strOrig.substring(1,strOrig.length());
            else if (i == strOrig.length()-1)
            st=strOrig.substring(0, strOrig.length()-1);
            else 
                st=strOrig.substring(0, i)+strOrig.substring(i+1,strOrig.length());
            if (st.indexOf(st1) == -1) {
                fnd=true;
              j=i;
                break;  
            }
        }
        if (!fnd)
            System.out.println("The first no non repeated character");
        else
            System.out.println("The first non repeated character is " +strOrig.charAt(j));


    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM