算法设计:右鸽的AC自动机

右鸽的AC自动机

南华校草算法分析设计 右鸽的AC自动机——贪心法

实验环境

C++语言
Code::Blocks开发环境

实验内容

右鸽的AC自动机
Description
最近,右鸽学习了AC自动机,但是他很失望,因为在学AC自动机之前,他以为AC自动机就是自动AC的机器。然而,事实上,AC自动机其实是一个模式匹配的东东。。。
下面带大家来“深究”一下AC自动机这个东东哈哈哈,给你n个字符串,每个字符串只包含大写字母A——Z,且每个字符串的字符个数不超过100000个,现在你可以对每个字符串进行如下操作:
交换字符串s中任意相邻位置的两个字符,经过零次或者多次交换以后,要使得s >”ACZIDONGJI”’(字典序排序)。
请你输出最少的交换次数;如果无论怎么交换都无法满足题目要求,则输出-1。
Input
第一行输入一个正整数n,表示测试数据的组数(1<=n<=100)接下来输入n个字符串,每个字符串占一行,表示一组测试数据。
Output
针对每个字符串输出其对应的最少交换次数,输出一个换一行。

样例
输入:
3
AAC
ACZIDL
ACZIIIII
输出:
2
1
0

实验设计(问题解决方案)

由问题可知是要求出最少交换次数,可以用贪心法。
1、比较输入字符串与题目所给字符串的大小
2、若于输入字符串较小,则选取元素交换,再比较…
定义了一个字符串元素交换函数int much(string s),返回的是字符串的交换次数。
每一次都选择最优交换情况:每次选取字符串最前面的且交换后能使整个字符串变大的两个连续元素交换。(这样的一次交换可使得交换后的字符串变得最大)
交换一次后,记录Sum++。再与题目所给字符串进行比较,较小则继续最优交换,较大则返回Sum。
当字符串最大(无法产生交换)仍然比题目所给字符串小时,返回-1。
3、对返回的函数值输出。

程序及结果

源代码

#include<bits/stdc++.h>
using namespace std;
string small="ACZIDONGJI";

/****************字符串元素交换函数*****************/
int much(string s)
{
    int Sum=0;
    while(s<=small)
    {
        for(int i=0; i<(s.length()-1); i++)
        {
            if(s[i]<s[i+1])
            {
                char a;
                a=s[i];
                s[i]=s[i+1];
                s[i+1]=a;
                Sum++;
                break;
            }
            if(i==(s.length()-2))
            {
                return -1;
            }
        }
    }
    return Sum;

}

int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        string s;
        cin>>s;
        cout<<much(s)<<endl;
    }
    return 0;
}

运行结果

好烦

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值