+-字符串

来源:互联网 发布:c语言100到200的素数 编辑:程序博客网 时间:2024/06/05 10:54

+-字符串

时间限制:1000 ms  |  内存限制:65535 KB

难度:1

描述

Shiva得到了两个只有加号和减号的字符串,字串长度相同。Shiva一次可以把一个加号和它相邻的减号交换。他想知道最少需要多少次操作才能把第一个字符串变换成第二个字符串。你现在要去帮助他完成那个这个问题。

输入

多组测试数据

每组数据有两行,每行包含一个由”+”和”-“最成的字符串。每个子符串长度不超过5000。

输出

仅一个整数,输出最少需要操作的次数。如果答案不存在,输出-1。

样例输入

++-+--+ -++--++ 

样例输出

4

 

题解一:字符串a匹配成为字符b,从字符串a中遍历第一个字符与b中字符相等,然后对字符串a进行字符的交换,交换后,统计交换次数,以此类推,求其和。

题解二:求每个加号的位置差的和。

程序代码一:

//遍历ch2,然后从ch1中找到第一次出现ch2[i]的位置,然后交换并计数  

#include <iostream>  

#include <cstring>   

using namespace std;    

void change(int , int);   

char ch1[5001];  

char ch2[5001];   

int main()  //思想:字符匹配,成功后,将a转换为b 

{  

    int len;  

    int num1;  

    int num2;  

    int count;  

    while(cin >> ch1 >> ch2)  

    {  

        len = strlen(ch1);  

        num1 = num2 = 0;  

        count = 0;  

        for(int i = 0; i < len; i++)  

        {  

            if(ch1[i] == '+')  

                num1++;  

            if(ch2[i] == '+')  

                num2++;  

        }  

  

        if(num1 != num2)  

        {  

            cout << -1 << endl;  

            continue;  

        }  

  

        for(int i = 0; i < len; i++)  

        {  

            if(ch1[i] != ch2[i])  

            {  

                for(int j = i+1; j < len; j++)  

                {  

                    if(ch1[j] == ch2[i])  

                    {  

                        change(i, j);  

                        count += j - i;  

                        break;  

                    }  

                }  

            }  

        }  

  

        cout << count << endl;  

    }  

}  

  

void change(int i, int j)  

{  

    char t;  

    t = ch1[j];  

    for(int k = j; k > i; k--)  

    {  

        ch1[k] = ch1[k-1];  

    }  

    ch1[i] = t;  

}  

0 0
原创粉丝点击