zoukankan      html  css  js  c++  java
  • 牛客网 ==》腾讯2017暑期实习生编程题

    题目:

    链接:https://www.nowcoder.com/questionTerminal/28c1dc06bc9b4afd957b01acdf046e69
    来源:牛客网
    给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
    输出需要删除的字符个数。

    输入描述:
    输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
    输出描述:

    对于每组数据,输出一个整数,代表最少需要删除的字符个数。

    示例1

    输入

    abcda
    google
    

    输出

    2
    2


    ====》本文章主要是采用C#求解,
    步骤:
    1、先把输入的字符串进行反转,得到串1
    2、利用动态规划求解两个字符串的最长公共子序列的长度
    3、最后拿字符串的长度减去公共子序列的长度,得到的是需要删除的子串长度


    得到的结果:======》在本地程序运行的结果什么都没问题,但是在把代码拷贝到牛客网上面以后,各种不通过。有时间还是要好好推敲一下。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace testNiuKe
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("请输入一串字符串:");
               string s = Console.ReadLine();
               
                Console.Write(RemoveHuiWen(s));//不能写WriteLine()===>换行时候字符串牛客网的输出用例显示错误!!!
                Console.ReadKey();
            }
            /// <summary>
            /// 判断一个字符串需要移除多少字符以后是回文
            /// </summary>
            private static int RemoveHuiWen(string s)
            {
                if (String.IsNullOrEmpty(s))
                {
                    return 0;
                }
                string reverseS = null;//翻转字符串 abcda
                //反转字符串
                for (int i = s.Length - 1; i >= 0; i--)
                {
                    reverseS += s[i];
                }
                int[][] c = new int[s.Length + 1][];
                for (int i = 0; i < s.Length + 1; i++)
                {
                    c[i] = new int[reverseS.Length + 1];
                }
    
                for (int i = 1; i < s.Length; i++)
                {
                    c[i][0] = 0;
                }
                for (int j = 1; j < reverseS.Length; j++)
                {
                    c[0][j] = 0;
                }
                for (int i = 1; i < s.Length; i++)
                {
                    for (int j = 1; j < reverseS.Length; j++)
                    {
                        if (s[i] == reverseS[j])
                        {
                            c[i][j] = c[i - 1][j - 1] + 1;
                        }
                        else
                        {
                            c[i][j] = Math.Max(c[i - 1][j], c[i][j - 1]);
                        }
                    }
                }
    
    
                return s.Length - c[s.Length - 1][reverseS.Length - 1]-1;
            }
        }
    }
    每天进步一点点。。
  • 相关阅读:
    zookeeper3.5.6单机集群环境搭建
    mycat分表
    myacat分片及全局表定义
    装饰器
    函数参数,作用域
    可变,不可变,无序, 有序
    dict
    列表可变,元祖不可变
    列表操作
    字符串find
  • 原文地址:https://www.cnblogs.com/striveJJC/p/10338318.html
Copyright © 2011-2022 走看看