qq_43125834 2018-09-11 21:16 采纳率: 0%
浏览 493

算法问题求解 关于字符串处理

给定两个长度为n的字符串 X,Y
现对X的任意长度的连续子串有两种操作:
1. 按字母表顺序前进一位 如 a -> b aa->bb ac->bd
2. 按字母表顺序后退一位 如 b -> a bcd ->abc
求从X->Y的最小操作步骤(只有小写字母)

样例输入:
cccaba aaaccc
输出:
5

  • 写回答

2条回答 默认 最新

  • threenewbee 2018-09-12 06:46
    关注
     using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Q699794
    {
        class Program
        {
            static IEnumerable<Tuple<int, int>> substrs(string s1, string s2)
            {
                for (int i = 0; i < s1.Length; i++)
                {
                    for (int j = 1; j < s1.Length - i + 1; j++)
                    {
                        yield return new Tuple<int, int>(i, j);
                    }
                }
            }
    
            static string transtr(string s, int n)
            {
                string r = "";
                for (int i = 0; i < s.Length; i++)
                {
                    int ch = (s[i] - n);
                    if (ch < 'a') ch += 26;
                    if (ch > 'z') ch -= 26;
                    r += ((char)ch).ToString();
                }
                return r;
            }
    
            static bool trytans(string s1, string s2)
            {
                int n = s1[0] - s2[0];
                return transtr(s1, n) == s2;
            }
    
            static int solve(string s)
            {
                string[] arr = s.Split(' ');
                int cnt = 0;
                while (arr[0] != arr[1])
                {
                    foreach (var i in substrs(arr[0], arr[1]).OrderByDescending(x => x.Item2))
                    {
                        if (arr[0].Substring(i.Item1, i.Item2)[0] == arr[1].Substring(i.Item1, i.Item2)[0])
                            continue;
                        if (trytans(arr[0].Substring(i.Item1, i.Item2), arr[1].Substring(i.Item1, i.Item2)))
                        {
                            arr[0] = arr[0].Substring(0, i.Item1) + arr[1].Substring(i.Item1, i.Item2) + arr[0].Substring(i.Item1 + i.Item2);
                            Console.WriteLine(arr[0]);
                            cnt++;
                            goto l2;
                        }
                    }
                l2:
                    ;
                }
                return cnt;
            }
    
            static void Main(string[] args)
            {
                string input = "cccaba aaaccc";
                //input = Console.ReadLine();
                int c = solve(input);
                Console.WriteLine(c);
            }
        }
    }
    
    

    aaaaba
    aaacba
    aaacca
    aaaccc
    4
    Press any key to continue . . .

    结果应该是4才对。

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog