心の旅 blog

心だけでも旅に出れる

【いろんな言語で書いてみた】ある文字列が、全てユニークであるかどうか判定する関数

PHP

<?php

$str = "あいうえおabcdefg";

/**
 * 文字列が重複していないかどうか?
 *
 * @param string $str
 * @return boolean
 */
function isUniqueString($str)
{
  $count = mb_strlen(trim($str), "UTF-8");

  $strArray = [];
  for($i=0; $i<$count; $i++) {
    $strArray[] = mb_substr($str, $i, 1, "UTF-8");
  }

  $uniqueFlags = array();
  for($i=0; $i<$count; $i++) {
    $val = $strArray[$i];
    if(array_key_exists($val, $uniqueFlags) && $uniqueFlags[$val] === true) {
      return false;
    }
    $uniqueFlags[$val] = true;
  }

  return true;
}


var_dump(isUniqueString($str));

JavaScript

var str = "あいうえおabcdefg";


/**
 * 与えた文字列の中に重複した文字がないか判定する関数
 *
 * @param {string} str
 * @return {boolean}
 */
function isUniqueString(str) {

  str = str.trim();
  var strs = str.split('');

  var i, uniqueFlags = [];
  for(i=0; i<str.length; i++) {
    var val = strs[i];
    if(val in uniqueFlags && uniqueFlags[val] == true) {
      return false;
    }
    uniqueFlags[val] = true;
  }

  return true;
}

console.log(isUniqueString(str));

Ruby

str = 'あいうえおabcdefg'

# 指定した文字列に重複があるかどうか判定する関数
# @param [string] str 文字
# @return [boolean] 重複がなければtrue
def is_unique_string(str)

  strs = str.strip.split("")

  is_unique_flags = {}
  for str in strs do
    if is_unique_flags.has_key?(str) && is_unique_flags[str] == true
      return false
    end
    is_unique_flags[str] = true
  end

  return true
end

puts is_unique_string(str)

Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-

str = u'あいうえおabcdefg'

def is_unique_string(str):
  u"""指定した文字列に重複文字があるか判定する関数

  Keyword arguments:
  str -- string
  """

  str = str.strip()

  unique_flags = {}
  for i in range(0, len(str)):
    val = str[i]
    if val in unique_flags and unique_flags[val] == True:
      return False
    unique_flags[val] = True

  return True

if __name__ == "__main__":
  print is_unique_string(str)

Go

package main

import "fmt"

const str string = "あいうえおabcdefg"

// 指定した文字列に重複があるかどうか判定する関数
// param string str
// return boolean
func IsUniqueString(str string) bool {

>-uniqueFlags := make(map[string]bool)
>-for _, c := range str {
>->-var val = string([]rune{c})
>->-var _, ok = uniqueFlags[val]
>->-if ok == true && uniqueFlags[val] == true {
>->->-return false
>->-}
>->-uniqueFlags[val] = true
>-}

>-return true
}

// main 関数
func main() {
>-// 判定
>-fmt.Println(IsUniqueString(str))
}

Elixir

#
# 指定した文字列に重複があるかどうか判定する
#

defmodule IsUniqueString do

  def main(str) do
    length = String.length(str)
    status = loop_string(str, length, 0)
    if status == nil do
      IO.puts true
    else
      IO.puts false
    end
  end

  def loop_string(str, length, pos) do
    if 0 <= pos && pos < length do
      val = String.at(str, pos)
      status = check_unique(val, str, length, pos+1)
      if status == false do
        false
      else
        loop_string(str, length, pos+1)
      end
    end
  end

  def check_unique(val, str, length, pos) do
    if 0 <= pos && pos < length do
      if val == String.at(str, pos) do
        false
      else
        check_unique(val, str, length, pos+1)
      end
    end
  end

end


str = "あいうえおabcdefg"
IsUniqueString.main(str)