classSolution: defminimumCost(self, source: str, target: str, original: List[str], changed: List[str], cost: List[int]) -> int: g = [[float("inf")] * 26for _ inrange(26)] for i inrange(26): g[i][i] = 0 for u, v, w inzip(original, changed, cost): # 初始化 u, v = ord(u)-ord('a'), ord(v)-ord('a') g[u][v] = min(g[u][v], w) # 這裡要注意,因為可能有重複的邊,所以要取最小值
# Floyd-Warshall for k inrange(26): # 枚舉中間點 for i inrange(26): # 枚舉起點 if g[i][k] == float("inf"): continue# 不可能由 g[i][k] 轉移到其他點 for j inrange(26): # 枚舉終點 g[i][j] = min(g[i][j], g[i][k] + g[k][j]) # 更新 g[i][j] ans = 0 for u, v inzip(source, target): # 枚舉每個字元 u, v = ord(u)-ord('a'), ord(v)-ord('a') if g[u][v] == float("inf"): # 不連通,不可能修改成 target return -1 ans += g[u][v] # 將 u 修改成 v 的成本加總 return ans
classSolution { public: longlongminimumCost(string source, string target, vector<char>& original, vector<char>& changed, vector<int>& cost){ vector<vector<int>> g(26, vector<int>(26, INT_MAX/2)); // 初始化 for (int i = 0; i < 26; i++) { g[i][i] = 0; } for (int i = 0; i < original.size(); i++) { int u = original[i] - 'a'; int v = changed[i] - 'a'; g[u][v] = min(g[u][v], cost[i]); // 這裡要注意,因為可能有重複的邊,所以要取最小值 } // Floyd-Warshall for (int k = 0; k < 26; k++) { // 枚舉中間點 for (int i = 0; i < 26; i++) { // 枚舉起點 if (g[i][k] == INT_MAX/2) continue; // 不可能由 g[i][k] 轉移到其他點 for (int j = 0; j < 26; j++) { // 枚舉終點 g[i][j] = min(g[i][j], g[i][k] + g[k][j]); // 更新 g[i][j] } } }
longlong ans = 0; for (int i = 0; i < source.size(); i++) { // 枚舉每個字元 int u = source[i] - 'a'; int v = target[i] - 'a'; if (g[u][v] == INT_MAX/2) { // 不連通,不可能修改成 target return-1; } ans += g[u][v]; // 將 u 修改成 v 的成本加總 } return ans; } };
寫在最後
Cover photo is remixed from @吃肥皂泡泡, thanks for their work!