1
0
mirror of https://gitee.com/coder-xiaomo/leetcode-problemset synced 2025-09-05 15:31:43 +08:00
Code Issues Projects Releases Wiki Activity GitHub Gitee
This commit is contained in:
2023-12-29 14:49:55 +08:00
parent a0a115e04c
commit f14c8312c2
47 changed files with 18156 additions and 13738 deletions

View File

@@ -0,0 +1,46 @@
<p>给你一个长度为&nbsp;<code>n</code>&nbsp;&nbsp;<strong></strong>&nbsp;整数数组&nbsp;<code>nums</code>&nbsp;</p>
<p><strong>多边形</strong>&nbsp;指的是一个至少有 <code>3</code>&nbsp;条边的封闭二维图形。多边形的 <strong>最长边</strong>&nbsp;一定 <strong>小于</strong>&nbsp;所有其他边长度之和。</p>
<p>如果你有&nbsp;<code>k</code>&nbsp;<code>k &gt;= 3</code>)个&nbsp;<strong></strong>&nbsp;&nbsp;<code>a<sub>1</sub></code><code>a<sub>2</sub></code><code>a<sub>3</sub></code>, ...<code>a<sub>k</sub></code> 满足&nbsp;<code>a<sub>1</sub> &lt;= a<sub>2</sub> &lt;= a<sub>3</sub> &lt;= ... &lt;= a<sub>k</sub></code> <strong></strong> <code>a<sub>1</sub> + a<sub>2</sub> + a<sub>3</sub> + ... + a<sub>k-1</sub> &gt; a<sub>k</sub></code><sub>&nbsp;</sub>,那么 <strong>一定</strong>&nbsp;存在一个&nbsp;<code>k</code>&nbsp;条边的多边形,每条边的长度分别为&nbsp;<code>a<sub>1</sub></code>&nbsp;<code>a<sub>2</sub></code>&nbsp;<code>a<sub>3</sub></code>&nbsp;&nbsp;...<code>a<sub>k</sub></code>&nbsp;</p>
<p>一个多边形的 <strong>周长</strong>&nbsp;指的是它所有边之和。</p>
<p>请你返回从 <code>nums</code>&nbsp;中可以构造的 <strong>多边形&nbsp;</strong><strong>最大周长</strong>&nbsp;。如果不能构造出任何多边形,请你返回 <code>-1</code>&nbsp;</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<b>输入:</b>nums = [5,5,5]
<b>输出:</b>15
<b>解释:</b>nums 中唯一可以构造的多边形为三角形,每条边的长度分别为 5 5 和 5 ,周长为 5 + 5 + 5 = 15 。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<b>输入:</b>nums = [1,12,1,2,5,50,3]
<b>输出:</b>12
<b>解释:</b>最大周长多边形为五边形,每条边的长度分别为 1 1 2 3 和 5 ,周长为 1 + 1 + 2 + 3 + 5 = 12 。
我们无法构造一个包含变长为 12 或者 50 的多边形,因为其他边之和没法大于两者中的任何一个。
所以最大周长为 12 。
</pre>
<p><strong class="example">示例 3</strong></p>
<pre>
<b>输入:</b>nums = [5,5,50]
<b>输出:</b>-1
<b>解释:</b>无法构造任何多边形,因为多边形至少要有 3 条边且 50 &gt; 5 + 5 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>3 &lt;= n &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= nums[i] &lt;= 10<sup>9</sup></code></li>
</ul>

View File

@@ -0,0 +1,38 @@
<p>你有一个下标从 <strong>0</strong> 开始、长度为 <strong>偶数</strong> 的整数数组 <code>nums</code> ,同时还有一个空数组 <code>arr</code> 。Alice 和 Bob 决定玩一个游戏,游戏中每一轮 Alice 和 Bob 都会各自执行一次操作。游戏规则如下:</p>
<ul>
<li>每一轮Alice 先从 <code>nums</code> 中移除一个<strong> 最小</strong> 元素,然后 Bob 执行同样的操作。</li>
<li>接着Bob 会将移除的元素添加到数组 <code>arr</code> 中,然后 Alice 也执行同样的操作。</li>
<li>游戏持续进行,直到 <code>nums</code> 变为空。</li>
</ul>
<p>返回结果数组 <code>arr</code></p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<strong>输入:</strong>nums = [5,4,2,3]
<strong>输出:</strong>[3,2,5,4]
<strong>解释:</strong>第一轮Alice 先移除 2 ,然后 Bob 移除 3 。然后 Bob 先将 3 添加到 arr 中,接着 Alice 再将 2 添加到 arr 中。于是 arr = [3,2] 。
第二轮开始时nums = [5,4] 。Alice 先移除 4 ,然后 Bob 移除 5 。接着他们都将元素添加到 arr 中arr 变为 [3,2,5,4] 。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<strong>输入:</strong>nums = [2,5]
<strong>输出:</strong>[5,2]
<strong>解释:</strong>第一轮Alice 先移除 2 ,然后 Bob 移除 5 。然后 Bob 先将 5 添加到 arr 中,接着 Alice 再将 2 添加到 arr 中。于是 arr = [5,2] 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= nums.length &lt;= 100</code></li>
<li><code>1 &lt;= nums[i] &lt;= 100</code></li>
<li><code>nums.length % 2 == 0</code></li>
</ul>

View File

@@ -0,0 +1,62 @@
<p>给你一棵&nbsp;<code>n</code>&nbsp;个节点的&nbsp;<strong>无向</strong>&nbsp;树,节点编号为&nbsp;<code>0</code>&nbsp;&nbsp;<code>n - 1</code>&nbsp;,树的根节点在节点&nbsp;<code>0</code>&nbsp;处。同时给你一个长度为 <code>n - 1</code>&nbsp;的二维整数数组&nbsp;<code>edges</code>&nbsp;,其中&nbsp;<code>edges[i] = [a<sub>i</sub>, b<sub>i</sub>]</code>&nbsp;表示树中节点&nbsp;<code>a<sub>i</sub></code>&nbsp;<code>b<sub>i</sub></code>&nbsp;之间有一条边。</p>
<p>给你一个长度为 <code>n</code>&nbsp;下标从 <strong>0</strong>&nbsp;开始的整数数组&nbsp;<code>cost</code>&nbsp;,其中&nbsp;<code>cost[i]</code>&nbsp;是第 <code>i</code>&nbsp;个节点的 <b>开销</b>&nbsp;</p>
<p>你需要在树中每个节点都放置金币,在节点 <code>i</code>&nbsp;处的金币数目计算方法如下:</p>
<ul>
<li>如果节点 <code>i</code>&nbsp;对应的子树中的节点数目小于&nbsp;<code>3</code>&nbsp;,那么放&nbsp;<code>1</code>&nbsp;个金币。</li>
<li>否则,计算节点 <code>i</code> 对应的子树内 <code>3</code> 个不同节点的开销乘积的 <strong>最大值</strong> ,并在节点 <code>i</code> 处放置对应数目的金币。如果最大乘积是 <b>负数</b>&nbsp;,那么放置 <code>0</code>&nbsp;个金币。</li>
</ul>
<p>请你返回一个长度为 <code>n</code>&nbsp;的数组<em>&nbsp;</em><code>coin</code>&nbsp;<code>coin[i]</code>是节点&nbsp;<code>i</code>&nbsp;处的金币数目。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2023/11/09/screenshot-2023-11-10-012641.png" style="width: 600px; height: 233px;" /></p>
<pre>
<b>输入:</b>edges = [[0,1],[0,2],[0,3],[0,4],[0,5]], cost = [1,2,3,4,5,6]
<b>输出:</b>[120,1,1,1,1,1]
<b>解释:</b>在节点 0 处放置 6 * 5 * 4 = 120 个金币。所有其他节点都是叶子节点,子树中只有 1 个节点,所以其他每个节点都放 1 个金币。
</pre>
<p><strong class="example">示例 2</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2023/11/09/screenshot-2023-11-10-012614.png" style="width: 800px; height: 374px;" /></p>
<pre>
<b>输入:</b>edges = [[0,1],[0,2],[1,3],[1,4],[1,5],[2,6],[2,7],[2,8]], cost = [1,4,2,3,5,7,8,-4,2]
<b>输出:</b>[280,140,32,1,1,1,1,1,1]
<b>解释:</b>每个节点放置的金币数分别为:
- 节点 0 处放置 8 * 7 * 5 = 280 个金币。
- 节点 1 处放置 7 * 5 * 4 = 140 个金币。
- 节点 2 处放置 8 * 2 * 2 = 32 个金币。
- 其他节点都是叶子节点,子树内节点数目为 1 ,所以其他每个节点都放 1 个金币。
</pre>
<p><strong class="example">示例 3</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2023/11/09/screenshot-2023-11-10-012513.png" style="width: 300px; height: 277px;" /></p>
<pre>
<b>输入:</b>edges = [[0,1],[0,2]], cost = [1,2,-2]
<b>输出:</b>[0,1,1]
<b>解释:</b>节点 1 和 2 都是叶子节点,子树内节点数目为 1 ,各放置 1 个金币。节点 0 处唯一的开销乘积是 2 * 1 * -2 = -4 。所以在节点 0 处放置 0 个金币。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>2 &lt;= n &lt;= 2 * 10<sup>4</sup></code></li>
<li><code>edges.length == n - 1</code></li>
<li><code>edges[i].length == 2</code></li>
<li><code>0 &lt;= a<sub>i</sub>, b<sub>i</sub> &lt; n</code></li>
<li><code>cost.length == n</code></li>
<li><code>1 &lt;= |cost[i]| &lt;= 10<sup>4</sup></code></li>
<li><code>edges</code>&nbsp;一定是一棵合法的树。</li>
</ul>

View File

@@ -0,0 +1,43 @@
<p>有一个大型的 <code>(m - 1) x (n - 1)</code> 矩形田地,其两个对角分别是 <code>(1, 1)</code><code>(m, n)</code> ,田地内部有一些水平栅栏和垂直栅栏,分别由数组 <code>hFences</code><code>vFences</code> 给出。</p>
<p>水平栅栏为坐标 <code>(hFences[i], 1)</code><code>(hFences[i], n)</code>,垂直栅栏为坐标 <code>(1, vFences[i])</code><code>(m, vFences[i])</code></p>
<p>返回通过<strong> 移除 </strong>一些栅栏(<strong>可能不移除</strong>)所能形成的最大面积的<strong> 正方形 </strong>田地的面积,或者如果无法形成正方形田地则返回 <code>-1</code></p>
<p>由于答案可能很大,所以请返回结果对 <code>10<sup>9</sup> + 7</code> <strong>取余</strong> 后的值。</p>
<p><strong>注意:</strong>田地外围两个水平栅栏(坐标 <code>(1, 1)</code><code>(1, n)</code> 和坐标 <code>(m, 1)</code><code>(m, n)</code> )以及两个垂直栅栏(坐标 <code>(1, 1)</code><code>(m, 1)</code> 和坐标 <code>(1, n)</code><code>(m, n)</code> )所包围。这些栅栏<strong> 不能</strong> 被移除。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2023/11/05/screenshot-from-2023-11-05-22-40-25.png" /></p>
<pre>
<strong>输入:</strong>m = 4, n = 3, hFences = [2,3], vFences = [2]
<strong>输出:</strong>4
<strong>解释:</strong>移除位于 2 的水平栅栏和位于 2 的垂直栅栏将得到一个面积为 4 的正方形田地。
</pre>
<p><strong class="example">示例 2</strong></p>
<p><img alt="" src="https://assets.leetcode.com/uploads/2023/11/22/maxsquareareaexample1.png" style="width: 285px; height: 242px;" /></p>
<pre>
<strong>输入:</strong>m = 6, n = 7, hFences = [2], vFences = [4]
<strong>输出:</strong>-1
<strong>解释:</strong>可以证明无法通过移除栅栏形成正方形田地。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>3 &lt;= m, n &lt;= 10<sup>9</sup></code></li>
<li><code>1 &lt;= hFences.length, vFences.length &lt;= 600</code></li>
<li><code>1 &lt; hFences[i] &lt; m</code></li>
<li><code>1 &lt; vFences[i] &lt; n</code></li>
<li><code>hFences</code><code>vFences</code> 中的元素是唯一的。</li>
</ul>

View File

@@ -0,0 +1,45 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始的 <b></b>&nbsp;整数数组&nbsp;<code>nums</code>&nbsp;</p>
<p>如果 <code>nums</code>&nbsp;的一个子数组满足:移除这个子数组后剩余元素 <strong>严格递增</strong>&nbsp;,那么我们称这个子数组为 <strong>移除递增</strong>&nbsp;子数组。比方说,<code>[5, 3, 4, 6, 7]</code>&nbsp;中的 <code>[3, 4]</code>&nbsp;是一个移除递增子数组,因为移除该子数组后,<code>[5, 3, 4, 6, 7]</code>&nbsp;变为&nbsp;<code>[5, 6, 7]</code>&nbsp;,是严格递增的。</p>
<p>请你返回 <code>nums</code>&nbsp;<b>移除递增</b>&nbsp;子数组的总数目。</p>
<p><b>注意</b>&nbsp;,剩余元素为空的数组也视为是递增的。</p>
<p><strong>子数组</strong> 指的是一个数组中一段连续的元素序列。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<b>输入:</b>nums = [1,2,3,4]
<b>输出:</b>10
<b>解释:</b>10 个移除递增子数组分别为:[1], [2], [3], [4], [1,2], [2,3], [3,4], [1,2,3], [2,3,4] 和 [1,2,3,4]。移除任意一个子数组后,剩余元素都是递增的。注意,空数组不是移除递增子数组。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<b>输入:</b>nums = [6,5,7,8]
<b>输出:</b>7
<b>解释:</b>7<strong>&nbsp;</strong>个移除递增子数组分别为:[5], [6], [5,7], [6,5], [5,7,8], [6,5,7] 和 [6,5,7,8] 。
nums 中只有这 7 个移除递增子数组。
</pre>
<p><strong class="example">示例 3</strong></p>
<pre>
<b>输入:</b>nums = [8,7,6,6]
<b>输出:</b>3
<b>解释:</b>3 个移除递增子数组分别为:[8,7,6], [7,6,6] 和 [8,7,6,6] 。注意 [8,7] 不是移除递增子数组因为移除 [8,7] 后 nums 变为 [6,6] ,它不是严格递增的。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= nums.length &lt;= 50</code></li>
<li><code>1 &lt;= nums[i] &lt;= 50</code></li>
</ul>

View File

@@ -0,0 +1,45 @@
<p>给你一个下标从 <strong>0</strong>&nbsp;开始的 <b></b>&nbsp;整数数组&nbsp;<code>nums</code>&nbsp;</p>
<p>如果 <code>nums</code>&nbsp;的一个子数组满足:移除这个子数组后剩余元素 <strong>严格递增</strong>&nbsp;,那么我们称这个子数组为 <strong>移除递增</strong>&nbsp;子数组。比方说,<code>[5, 3, 4, 6, 7]</code>&nbsp;中的 <code>[3, 4]</code>&nbsp;是一个移除递增子数组,因为移除该子数组后,<code>[5, 3, 4, 6, 7]</code>&nbsp;变为&nbsp;<code>[5, 6, 7]</code>&nbsp;,是严格递增的。</p>
<p>请你返回 <code>nums</code>&nbsp;<b>移除递增</b>&nbsp;子数组的总数目。</p>
<p><b>注意</b>&nbsp;,剩余元素为空的数组也视为是递增的。</p>
<p><strong>子数组</strong> 指的是一个数组中一段连续的元素序列。</p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<b>输入:</b>nums = [1,2,3,4]
<b>输出:</b>10
<b>解释:</b>10 个移除递增子数组分别为:[1], [2], [3], [4], [1,2], [2,3], [3,4], [1,2,3], [2,3,4] 和 [1,2,3,4]。移除任意一个子数组后,剩余元素都是递增的。注意,空数组不是移除递增子数组。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<b>输入:</b>nums = [6,5,7,8]
<b>输出:</b>7
<b>解释:</b>7<strong>&nbsp;</strong>个移除递增子数组分别为:[5], [6], [5,7], [6,5], [5,7,8], [6,5,7] 和 [6,5,7,8] 。
nums 中只有这 7 个移除递增子数组。
</pre>
<p><strong class="example">示例 3</strong></p>
<pre>
<b>输入:</b>nums = [8,7,6,6]
<b>输出:</b>3
<b>解释:</b>3 个移除递增子数组分别为:[8,7,6], [7,6,6] 和 [8,7,6,6] 。注意 [8,7] 不是移除递增子数组因为移除 [8,7] 后 nums 变为 [6,6] ,它不是严格递增的。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= nums.length &lt;= 10<sup>5</sup></code></li>
<li><code>1 &lt;= nums[i] &lt;= 10<sup>9</sup></code></li>
</ul>

View File

@@ -0,0 +1,58 @@
<p>给你两个下标从 <strong>0</strong> 开始的字符串 <code>source</code><code>target</code> ,它们的长度均为 <code>n</code> 并且由 <strong>小写 </strong>英文字母组成。</p>
<p>另给你两个下标从 <strong>0</strong> 开始的字符数组 <code>original</code><code>changed</code> ,以及一个整数数组 <code>cost</code> ,其中 <code>cost[i]</code> 代表将字符 <code>original[i]</code> 更改为字符 <code>changed[i]</code> 的成本。</p>
<p>你从字符串 <code>source</code> 开始。在一次操作中,<strong>如果 </strong>存在 <strong>任意</strong> 下标 <code>j</code> 满足 <code>cost[j] == z</code>&nbsp;<code>original[j] == x</code> 以及 <code>changed[j] == y</code> 。你就可以选择字符串中的一个字符 <code>x</code> 并以 <code>z</code> 的成本将其更改为字符 <code>y</code></p>
<p>返回将字符串 <code>source</code> 转换为字符串 <code>target</code> 所需的<strong> 最小 </strong>成本。如果不可能完成转换,则返回 <code>-1</code></p>
<p><strong>注意</strong>,可能存在下标 <code>i</code><code>j</code> 使得 <code>original[j] == original[i]</code><code>changed[j] == changed[i]</code></p>
<p>&nbsp;</p>
<p><strong class="example">示例 1</strong></p>
<pre>
<strong>输入:</strong>source = "abcd", target = "acbe", original = ["a","b","c","c","e","d"], changed = ["b","c","b","e","b","e"], cost = [2,5,5,1,2,20]
<strong>输出:</strong>28
<strong>解释:</strong>将字符串 "abcd" 转换为字符串 "acbe"
- 更改下标 1 处的值 'b' 为 'c' ,成本为 5 。
- 更改下标 2 处的值 'c' 为 'e' ,成本为 1 。
- 更改下标 2 处的值 'e' 为 'b' ,成本为 2 。
- 更改下标 3 处的值 'd' 为 'e' ,成本为 20 。
产生的总成本是 5 + 1 + 2 + 20 = 28 。
可以证明这是可能的最小成本。
</pre>
<p><strong class="example">示例 2</strong></p>
<pre>
<strong>输入:</strong>source = "aaaa", target = "bbbb", original = ["a","c"], changed = ["c","b"], cost = [1,2]
<strong>输出:</strong>12
<strong>解释:</strong>要将字符 'a' 更改为 'b'
- 将字符 'a' 更改为 'c',成本为 1
- 将字符 'c' 更改为 'b',成本为 2
产生的总成本是 1 + 2 = 3。
将所有 'a' 更改为 'b',产生的总成本是 3 * 4 = 12 。
</pre>
<p><strong class="example">示例 3</strong></p>
<pre>
<strong>输入:</strong>source = "abcd", target = "abce", original = ["a"], changed = ["e"], cost = [10000]
<strong>输出:</strong>-1
<strong>解释:</strong>无法将 source 字符串转换为 target 字符串,因为下标 3 处的值无法从 'd' 更改为 'e' 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= source.length == target.length &lt;= 10<sup>5</sup></code></li>
<li><code>source</code><code>target</code> 均由小写英文字母组成</li>
<li><code>1 &lt;= cost.length== original.length == changed.length &lt;= 2000</code></li>
<li><code>original[i]</code><code>changed[i]</code> 是小写英文字母</li>
<li><code>1 &lt;= cost[i] &lt;= 10<sup>6</sup></code></li>
<li><code>original[i] != changed[i]</code></li>
</ul>

View File

@@ -0,0 +1,67 @@
<p>给你两个下标从 <strong>0</strong> 开始的字符串 <code>source</code><code>target</code> ,它们的长度均为 <code>n</code> 并且由 <strong>小写 </strong>英文字母组成。</p>
<p>另给你两个下标从 <strong>0</strong> 开始的字符串数组 <code>original</code><code>changed</code> ,以及一个整数数组 <code>cost</code> ,其中 <code>cost[i]</code> 代表将字符串 <code>original[i]</code> 更改为字符串 <code>changed[i]</code> 的成本。</p>
<p>你从字符串 <code>source</code> 开始。在一次操作中,<strong>如果 </strong>存在 <strong>任意</strong> 下标 <code>j</code> 满足 <code>cost[j] == z</code>&nbsp;<code>original[j] == x</code> 以及 <code>changed[j] == y</code> ,你就可以选择字符串中的 <strong>子串</strong> <code>x</code> 并以 <code>z</code> 的成本将其更改为 <code>y</code> 。 你可以执行 <strong>任意数量 </strong>的操作,但是任两次操作必须满足<strong> 以下两个 </strong>条件 <strong>之一</strong> </p>
<ul>
<li>在两次操作中选择的子串分别是 <code>source[a..b]</code><code>source[c..d]</code> ,满足 <code>b &lt; c</code>&nbsp; <strong></strong> <code>d &lt; a</code> 。换句话说,两次操作中选择的下标<strong> 不相交 </strong></li>
<li>在两次操作中选择的子串分别是 <code>source[a..b]</code><code>source[c..d]</code> ,满足 <code>a == c</code> <strong></strong> <code>b == d</code> 。换句话说,两次操作中选择的下标<strong> 相同 </strong></li>
</ul>
<p>返回将字符串 <code>source</code> 转换为字符串 <code>target</code> 所需的<strong> 最小 </strong>成本。如果不可能完成转换,则返回 <code>-1</code></p>
<p><strong>注意</strong>,可能存在下标 <code>i</code><code>j</code> 使得 <code>original[j] == original[i]</code><code>changed[j] == changed[i]</code></p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre>
<strong>输入:</strong>source = "abcd", target = "acbe", original = ["a","b","c","c","e","d"], changed = ["b","c","b","e","b","e"], cost = [2,5,5,1,2,20]
<strong>输出:</strong>28
<strong>解释:</strong>将 "abcd" 转换为 "acbe",执行以下操作:
- 将子串 source[1..1] 从 "b" 改为 "c" ,成本为 5 。
- 将子串 source[2..2] 从 "c" 改为 "e" ,成本为 1 。
- 将子串 source[2..2] 从 "e" 改为 "b" ,成本为 2 。
- 将子串 source[3..3] 从 "d" 改为 "e" ,成本为 20 。
产生的总成本是 5 + 1 + 2 + 20 = 28 。
可以证明这是可能的最小成本。
</pre>
<p><strong>示例 2</strong></p>
<pre>
<strong>输入:</strong>source = "abcdefgh", target = "acdeeghh", original = ["bcd","fgh","thh"], changed = ["cde","thh","ghh"], cost = [1,3,5]
<strong>输出:</strong>9
<strong>解释:</strong>将 "abcdefgh" 转换为 "acdeeghh",执行以下操作:
- 将子串 source[1..3] 从 "bcd" 改为 "cde" ,成本为 1 。
- 将子串 source[5..7] 从 "fgh" 改为 "thh" ,成本为 3 。可以执行此操作,因为下标 [5,7] 与第一次操作选中的下标不相交。
- 将子串 source[5..7] 从 "thh" 改为 "ghh" ,成本为 5 。可以执行此操作,因为下标 [5,7] 与第一次操作选中的下标不相交,且与第二次操作选中的下标相同。
产生的总成本是 1 + 3 + 5 = 9 。
可以证明这是可能的最小成本。
</pre>
<p><strong>示例 3</strong></p>
<pre>
<strong>输入:</strong>source = "abcdefgh", target = "addddddd", original = ["bcd","defgh"], changed = ["ddd","ddddd"], cost = [100,1578]
<strong>输出:</strong>-1
<strong>解释:</strong>无法将 "abcdefgh" 转换为 "addddddd" 。
如果选择子串 source[1..3] 执行第一次操作,以将 "abcdefgh" 改为 "adddefgh" ,你无法选择子串 source[3..7] 执行第二次操作,因为两次操作有一个共用下标 3 。
如果选择子串 source[3..7] 执行第一次操作,以将 "abcdefgh" 改为 "abcddddd" ,你无法选择子串 source[1..3] 执行第二次操作,因为两次操作有一个共用下标 3 。
</pre>
<p>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= source.length == target.length &lt;= 1000</code></li>
<li><code>source</code><code>target</code> 均由小写英文字母组成</li>
<li><code>1 &lt;= cost.length == original.length == changed.length &lt;= 100</code></li>
<li><code>1 &lt;= original[i].length == changed[i].length &lt;= source.length</code></li>
<li><code>original[i]</code><code>changed[i]</code> 均由小写英文字母组成</li>
<li><code>original[i] != changed[i]</code></li>
<li><code>1 &lt;= cost[i] &lt;= 10<sup>6</sup></code></li>
</ul>