【華為機試線上訓練】Day 9
公共字串計算
題目描述
題目標題:
計算兩個字串的最大公共字串的長度,字元不區分大小寫
詳細描述:
介面說明
原型:
int getCommonStrLength(char * pFirstStr, char * pSecondStr);
輸入引數:
char * pFirstStr //第一個字串
char * pSecondStr//第二個字串
輸入描述:
輸入兩個字串
輸出描述:
輸出一個整數
示例1
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <vector>
#include<algorithm>
using namespace std;
int main()
{
string str1,str2;
while(cin>>str1)
{
cin>>str2;
vector<vector<int> > matrix(str1.size(),vector<int>(str2.size()));
int max_num=0;
for(int i=0;i<str1.size();i++)
{
for(int j=0;j<str2.size();j++)
{
if(str1[i]!=str2[j])
matrix[i][j]=0;
else if(i==0||j==0)
{
matrix[i][j]=1;
if(max_num<1)
max_num=1;
}
else
{
matrix[i][j]=matrix[i-1][j-1]+1;
if(matrix[i][j]>max_num)
max_num=matrix[i][j];
}
}
}
cout<<max_num<<endl;
}
return 0;
}
計算字串的相似度
題目描述
對於不同的字串,我們希望能有辦法判斷相似程度,我們定義了一套操作方法來把兩個不相同的字串變得相同,具體的操作方法如下:
1 修改一個字元,如把“a”替換為“b”。
2 增加一個字元,如把“abdd”變為“aebdd”。
3 刪除一個字元,如把“travelling”變為“traveling”。
比如,對於“abcdefg”和“abcdef”兩個字串來說,我們認為可以通過增加和減少一個“g”的方式來達到目的。上面的兩種方案,都只需要一次操作。把這個操作所需要的次數定義為兩個字串的距離,而相似度等於“距離+1”的倒數。也就是說,“abcdefg”和“abcdef”的距離為1,相似度為1/2=0.5.
給定任意兩個字串,你是否能寫出一個演算法來計算出它們的相似度呢?
請實現如下介面
/* 功能:計算字串的相似度
* 輸入:pucAExpression/ pucBExpression:字串格式,如: "abcdef"
* 返回:字串的相似度,相似度等於“距離+1”的倒數,結果請用1/字串的形式,如1/2
*/
public static String calculateStringDistance(String expressionA, String expressionB)
{
/* 請實現*/
return null;
}
約束:
1、PucAExpression/ PucBExpression字串中的有效字元包括26個小寫字母。
2、PucAExpression/ PucBExpression算術表示式的有效性由呼叫者保證;
3、超過result範圍導致資訊無法正確表達的,返回null。
輸入描述:
輸入兩個字串
輸出描述:
輸出相似度,string型別
這道題其實簡單的理解就是為了求字串的最小編輯代價,也是一個經典的動態規劃題,複雜度O(M*N)
思路:1.求解狀態轉移矩陣dp[M + 1][N + 1],dp[i][j] 的值代表的是str1[0...i-1]編輯為str2[0...j-1]
的最小代價。
2. 計算過程:
1)dp[0][0] = 0,表示str1空的字串編輯為str2空的字串代價為0。
2)矩陣dp第一列即為dp[0...M-1][0],dp[i][0] 表示str1[0...i-1]編輯為空串的最小代價,所以就是將str1[0..M-1]的字元刪掉的代價
所以dp[i][0] = i;
3) 同2),那str2[0...j-1]編輯的代價,dp[0][j] = j;
4) 接下來的位置就按照從左到右,從上到下來計算,dp[i][j]的值來至於下面的幾種情況:
(1)str1[0...i-1]可以先編輯為str1[0..i-2],也就是刪除字元str1[i-1],然後由str1[0..i-2]編輯為str2[0...j-1],dp[i-1][j]表示str1[0..i-2]編輯為str2[0...j-1]的最小代價,
那麼dp[i][j]可能等於dp[i -1][j] + 1;
(2)str1[0...i-1]可以先編輯為str1[0..i-2],然後將str2[0..j-2]插入字元str2[j-1],編輯成str2[0...j-1],dp[i][j-1]表示str1[0..i-1]編輯成str2[0...j-2]的最小代價,
那麼dp[i][j] 可能等於dp[i][j-1] + 1;
(3) 如果str1[i - 1]!=str2[j-1] ,那麼先把str1[0..i-1]中的str1[0..i-2]的部分邊長str2[0..j-2],然後把字元str1[i-1]替換為str2[j-1],這樣str1[0..i-1]就編輯成為str2[0...j-1]了,dp[i - 1][j - 1]表示
str1[0..i-2]編輯為str2[0..j-2]的最小代價,那麼dp[i ][j]可能等於dp[i - 1][j - 1] + 1;
(4) 如果str1[i - 1]==str2[j-1] ,那麼先把str1[0..i-1]中的str1[0..i-2]的部分邊長str2[0..j-2],因為此時 str1[i - 1]==str2[j-1] ,所以str1[0..i-1]已經編輯為str2[0..j-1]了,dp[i - 1][j - 1]表示str1[0..i-2]編輯為str2[0..j-2]的最小代價, 那麼dp[i ][j]可能等於dp[i - 1][j - 1]。
上述的4中情況取最小值,dp的最右下角就是最終結果,即最小編輯代價。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String str1 = sc.next();
String str2 = sc.next();
System.out.println(calculateStringDistance(str1,str2));
}
}
private static String calculateStringDistance(String
str1, String str2){
if(str1 == null || str2 == null || str1.length() <= 0
|| str2.length() <= 0)
return null;
char[] chs1 = str1.toCharArray();
char[] chs2 = str2.toCharArray();
int dp = getDp(chs1,chs2);
System.out.println(dp);
return String.valueOf("1/" + (dp + 1));
}
private static int getDp(char[] chs1,char[] chs2){
int[][]dp = new int[chs1.length + 1][chs2.length + 1];
for(int i = 1;i<=chs1.length;i++){
dp[i][0] = i;
}
for(int j = 1;j<=chs2.length;j++){
dp[0][j] = j;
}
for(int i = 1;i<=chs1.length;i++){
for(int j = 1;j<=chs2.length;j++){
if(chs1[i - 1] == chs2[j - 1]){
dp[i][j] = dp[i - 1][j - 1];
}else{
dp[i][j] = dp[i - 1][j - 1] + 1;
}
dp[i][j] = Math.min(dp[i][j], dp[i][j - 1] + 1);
dp[i][j] = Math.min(dp[i][j], dp[i - 1][j] + 1);
}
}
return dp[chs1.length][chs2.length];
}
}
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
string a,b;
while(cin>>a>>b){
string res="1/";
int n = (int)a.size(),m = (int)b.size();
vector<vector<int>>dp(n+1,vector<int>(m+1,0));
dp[0][0] = 0;//dp[x][y]代表將a字串前x個字元修改成b字串前y個字元
for (int i=1; i<=m; ++i) dp[0][i] = i;
for (int i=1; i<=n; ++i) dp[i][0] = i;
for (int i=1; i<=n; ++i) {
for (int j=1; j<=m; ++j) {
int one = dp[i-1][j] +1,two = dp[i][j-1]+1,three = dp[i-1][j-1];
if(a[i-1]!=b[j-1]) three+=1;
dp[i][j] = min(min(one,two),three);
}
}
res+=to_string(1+dp[n][m]);
cout<<res<<endl;
}
return 0;
}
相關文章
- 【華為機試線上訓練】Day 10
- 【華為機試線上訓練】Day 11
- 【華為機試線上訓練】Day 6
- 【華為機試線上訓練】Day 7
- 【華為機試線上訓練】Day 8
- 【華為機試線上訓練】Day1
- 【華為機試線上訓練】Day2
- 【華為機試線上訓練】Day3
- 【華為機試線上訓練】Day4
- 華為部分線上測試題
- 演算法訓練day2演算法
- 雲端開爐,線上訓練,Bert-vits2-v2.2雲端線上訓練和推理實踐(基於GoogleColab)Go
- 華為機試 (11/8)
- 華為鯤鵬HCIA考試-練習05
- 【題解】Solution Set - NOIP2024集訓Day9 樹上問題
- YOLOv9:在自定義資料上進行影像分割訓練YOLO
- 華為freebuds耳機藍芽搜尋不到怎麼辦 華為freelace連線不上藍芽
- k線訓練營排名
- 史丹佛DAWNBench:華為雲ModelArts深度學習訓練全球最快深度學習
- 20240927 隨機訓練隨機
- 機率期望訓練
- CSAO×虎符安全訓練營 強強聯合,重磅上線
- 華為鯤鵬 DAY 4
- ECS 7天實踐訓練營-day1
- 手把手教你基於華為雲,實現MindSpore模型訓練模型
- 牛客網--華為機試題
- 華為機試-取近似值
- 華為雲在香港為大模型訓練推理提供即開即用澎湃算力大模型
- 2024牛客暑期多校訓練營9
- 教育培訓機構試水線上教育平臺搭建的可行性
- 華為機頂盒ec6108v9a刷機筆記筆記
- 華為昇騰訓練營筆記-Ascend C運算元開發筆記
- 小雞老師華為版終於上線華為應用市場
- 線上教育培訓機構如何推廣自己
- 華為機試題刷題總結
- 華為手機如何連線到電腦
- 新方案上線,華為為何加碼雲遊戲?遊戲
- MinIO線上故障演練