给定两个长度为n的字符串 X,Y
现对X的任意长度的连续子串有两种操作:
1. 按字母表顺序前进一位 如 a -> b aa->bb ac->bd
2. 按字母表顺序后退一位 如 b -> a bcd ->abc
求从X->Y的最小操作步骤(只有小写字母)
样例输入:
cccaba aaaccc
输出:
5
给定两个长度为n的字符串 X,Y
现对X的任意长度的连续子串有两种操作:
1. 按字母表顺序前进一位 如 a -> b aa->bb ac->bd
2. 按字母表顺序后退一位 如 b -> a bcd ->abc
求从X->Y的最小操作步骤(只有小写字母)
样例输入:
cccaba aaaccc
输出:
5
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才对。