zoukankan      html  css  js  c++  java
  • C#算法之判断一个字符串是否是对称字符串

    记得曾经一次面试时,面试官给我电脑,让我现场写个算法,判断一个字符串是不是对称字符串。我当时用了几分钟写了一个很简单的代码。

    这里说的对称字符串是指字符串的左边和右边字符顺序相反,如"abba",单个字符串暂且算非对称字符串,虽然有字符串看起来是对称的如"A、"H"、"O"、"中"、"人"...,严格来说,也是不对称的,把它们放大时,线条的粗细是不一样的。

    static bool IsSymmetry1(string str)
    {
        if (string.IsNullOrEmpty(str) || str.Length == 1)
        {
            return false;
        }
        for (int i = 0; i < str.Length / 2; i++)
        {
            if (str[i] != str[str.Length - 1 - i])
            {
                return false;
            }
        }
        return true;
    }

    这个很简单,最多遍历字符串长度的一半次数,对比第一个跟倒数第一个,第二个跟倒数第二个...

    功能是实现了,但给人的感觉是太简单,效率也不高。既然是算法,那就得效率高。

    我跟朋友讨论了下,朋友给了另一个方案

    static bool IsSymmetry2(string str)
    {
        if (string.IsNullOrEmpty(str) || str.Length == 1)
        {
            return false;
        }
        var halfLength = str.Length/2;
        var str1 = str.Substring(0, halfLength);
        var str2 = new String(str.Substring(str.Length%2 == 0 ? halfLength : halfLength + 1, halfLength).Reverse().ToArray());
        return str1.Equals(str2);            
    }

    这个方案就是将字符串拆成两半,将后一半反转跟前一半比较。

    效果也能实现,没用遍历,看起来比上个方案要高大上,实际运行效率更低。

    这两种方案只是入门级别的,肯定还有更好,更高效率的写法,请求各位大神分享.谢谢!

    如果觉得对你有帮助,请点个赞,谢谢!

    不足与错误之处,敬请批评指正!

  • 相关阅读:
    HashMap源码解析
    深入理解Java字符串
    Netty粘包、半包
    Netty源码分析-Future和Promise
    Lock简介
    一、Netty中的EventLoop
    对象实例化内存布局与访问定位
    运行时数据区概述及线程
    TCP三次握手和四次挥手
    Redis线程IO模型-Redis 单线程为什么还能这么快?
  • 原文地址:https://www.cnblogs.com/xiaoafei1991/p/4601210.html
Copyright © 2011-2022 走看看