fiixed
fiixed

Reputation: 141

Dart - find most common character in a string

I'm stuck on this common interview question using Dart. I need to return the most common character in a given string. I'm trying to create a map with a count for each character as the first step.

This is my progress so far:

main(List<String> arguments) {
  maxChar('hello');
}

void maxChar(String word) {
  Map<String, int> charMap = {};
  int max = 0;
  String maxChar = '';
  word.split('').forEach((char) {
    if(charMap.containsValue(char)) {
      charMap[char]+1;
      return;
    } else {
      charMap[char] = 1;
    }
  });
  print(charMap);
}

Right now its not even counting the correct amount of the letter 'l'. It's outputting:

{h: 1, e: 1, l: 1, o: 1}

What am I doing wrong? Is there an easier way to return the most common character in a String in Dart?

Thanks!

EDIT:

Ok, I've solved it, but surely there is a more concise way of solving this problem. See my solution below:

main(List<String> arguments) {
  print(max_char.maxChar('hello'));
}

String maxChar(String word) {
  Map<String, int> charMap = {};
  int max = -1;
  String maxChar = '';
  word.split('').forEach((char) {
    if(charMap.containsKey(char)) {
      charMap[char]++;
      return;
    } else {
      charMap[char] = 1;
    }
  });
  charMap.forEach((k,v) {
    if(v > max) {
      max = v;
      maxChar = k;
    }
  });
  return maxChar;
}

Upvotes: 0

Views: 1282

Answers (1)

lrn
lrn

Reputation: 71723

A shorter approach to counting the characters is definitely possible:

String charCount(String chars) {
  int maxChar = -1;
  int maxCount = 0;
  var counts = <int, int>{};
  for (var char in chars.runes) {
    int count = counts.update(char, (n) => n + 1, ifAbsent: () => 1);
    if (count > maxCount) {
      maxCount = count;
      maxChar = char;
    }
  }
  return String.fromCharCode(maxChar);
}

If you just want to count the characters, you can remove all the lines mentioning maxCount and maxChar.

I use integers to represent the characters instead of strings. That's cheaper and just as precise, and it allows you to recognize and combine Unicode UTF-16 surrogates.

Upvotes: 3

Related Questions