【问题标题】:How can I find the first non-repeating character in a string? [closed]如何找到字符串中的第一个非重复字符? [关闭]
【发布时间】:2011-02-02 15:58:18
【问题描述】:

我需要编写一个函数来返回字符串中的第一个非重复字符(不区分大小写)。例如,对于字符串"Thanks for visiting",它应该返回"h"

【问题讨论】:

  • 所以“T”和“t”被视为重复?
  • 这听起来有点像家庭作业...如果是这样,请使用家庭作业标签。
  • 这个问题的哪一部分你被困住了?您是否意识到需要计算字符串中的每个唯一字符?
  • 更重要的是,您是否意识到为您的班级处理论文的评分者也可能听说过 SO?

标签: string function perl duplicates


【解决方案1】:

您可以传递字符串中的字符并将每个字符的计数(以不区分大小写的方式)存储在哈希中。然后再传一遍,返回第一个计数为 1 的字符:

sub get_char {
    my ($string) = @_;
    my @chars = split //, $string;
    my %chars;
    ++$chars{ lc() } for @chars;
    $chars{ lc() } == 1 && return $_ for @chars;
}

显然,这种方法需要O(n) 时间和O(n) 额外空间。

【讨论】:

    【解决方案2】:

    使用substr()index()

    sub get_it {
        my $string = shift;
        for my $i ( 0 .. length($string) - 1 ) {
            my $char = substr $string, $i, 1;
            return $char if index( $string, $char, $i + 1 ) >= 0;
        }
    }
    

    【讨论】:

      【解决方案3】:
      sub { 
          # This assumes non-repeating means consecutive-repeating.
          # non-consecutive-repeating is too boring to answer
          my $string_copy = $_[0];
          $string_copy =~ s/(.)(\1)+//g; 
          return substr($string_copy ,0, 1)
      }  
      

      【讨论】:

      • 这不适用于 OP 的示例。
      • @mobrule - 请查看顶部的 cmets :) 对于 OP 的示例,第一个非连续重复字符是“T”,而不是“h”。我不想回答他已经发布了答案的绝对基本的家庭作业问题,而是回答了一个更难的问题
      猜你喜欢
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多