stringcmp.cpp

来自「设A和B是长度相同的2个字符串。A和B的距离定义为相应位置字符距离之和。2个非空」· C++ 代码 · 共 137 行

CPP
137
字号
#include <iostream>
#include <string>
#include <fstream>
#include <math.h>

using namespace std;

long k;

unsigned long MinDistance(const string & A,const string & B)
{
	unsigned long m,n;
	
	long t;
	
	m=A.length();
	n=B.length();

	long * a=new long[n+1];    //下标 0..n
	long * b=new long[n+1];

	int i,j,p,q;
	p=0;
	q=0;
    for (i=0;i<=m;++i)
	{
		for (j=0;j<=n;++j)
		{
			if (i==0)    //第0行
			{
				if (j==0) a[0]=0;   //0,0
				else
				{   
					a[j]=j*k;
                    if (B[j-1]==' ') a[j]-=(++p)*k;
				}
			}
			else //i>0
			{
				if (j==0)  //第0列
				{
					b[0]=i*k;
					if (A[i-1]==' ') b[j]-=(++q)*k;
				}
				
				else
				{
					
					t=A[i-1]-B[j-1];

					if (t<0) t=-t;

					if (t!=0)
						if ((A[i-1]==' ') || (B[j-1]==' ')) t=k;
						
						b[j]=a[j-1]+t;

						t=a[j];

						if (A[i-1]!=' ') 
						{
							t=t+k;
						}
						

						if (t<b[j])
						{
							b[j]=t;
						}
						

						t=b[j-1];

						if (B[j-1]!=' ') 
						{
							t=t+k;
						}
						
							if (t<b[j])
						{
							b[j]=t;
						}
						
				}
			}
		
			
		}
	    
		//后一行覆盖前一行
		if (i>0) memcpy(a,b,(n+1)*sizeof(long));
		
		
	}

    unsigned long result=b[n];

	delete [] b;
	delete [] a;
	

	return result;
}
void main()
{
	string A,B;

	ifstream fin("input.txt");
   
	
    if (fin.fail()!=0) 
	{
	  cout<<"Open Input File Fail!";
	  return;
	}

    //从input.txt中获取输入数据
	getline(fin,A);
    getline(fin,B);

	fin>>k;

	long result=MinDistance(A,B);
	
    ofstream fout("output.txt");
    if (fout.fail()!=0) 
	{
	  cout<<"Open Output File Fail!";
	  return;
	}

	fout<<result<<endl;

    
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?