列表

详情


1055. 形成字符串的最短路径

对于任何字符串,我们可以通过删除其中一些字符(也可能不删除)来构造该字符串的 子序列 。(例如,“ace” 是 “abcde” 的子序列,而 “aec” 不是)。

给定源字符串 source 和目标字符串 target,返回 源字符串 source 中能通过串联形成目标字符串 target 子序列 的最小数量 。如果无法通过串联源字符串中的子序列来构造目标字符串,则返回 -1

 

示例 1:

输入:source = "abc", target = "abcbc"
输出:2
解释:目标字符串 "abcbc" 可以由 "abc" 和 "bc" 形成,它们都是源字符串 "abc" 的子序列。

示例 2:

输入:source = "abc", target = "acdbc"
输出:-1
解释:由于目标字符串中包含字符 "d",所以无法由源字符串的子序列构建目标字符串。

示例 3:

输入:source = "xyz", target = "xzyxz"
输出:3
解释:目标字符串可以按如下方式构建: "xz" + "y" + "xz"。

 

提示:

相似题目

判断子序列

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int shortestWay(string source, string target) { } };

golang 解法, 执行用时: 0 ms, 内存消耗: 2.1 MB, 提交时间: 2023-10-22 10:27:00

func shortestWay(source string, target string) int {
    // 源字符串中所有字符的索引列表
    charToIndices := make([][]int, 26)
    for i := 0; i < len(source); i++ {
        c := source[i]
        if charToIndices[c-'a'] == nil {
            charToIndices[c-'a'] = make([]int, 0)
        }
        charToIndices[c-'a'] = append(charToIndices[c-'a'], i)
    }

    // 源字符串的指针
    sourceIterator := 0

    // 我们需要在源字符串上进行迭代的次数
    count := 1

    // 在源字符串中找到目标字符串的所有字符
    for _, c := range target {
        // 如果源字符串中不存在该字符,返回 -1
        if charToIndices[c-'a'] == nil {
            return -1
        }

        // 二分查找
        // 找出源迭代器旁边的字符在源字符串中的索引
        indices := charToIndices[c-'a']
        index := sort.Search(len(indices), func(i int) bool {
            return indices[i] >= sourceIterator
        })

        // 如果我们已经到达列表的末尾,我们需要重新遍历源字符串
        // 因此需要找到字符在源字符串中的第一个索引。
        if index == len(indices) {
            count++
            sourceIterator = indices[0] + 1
        } else {
            sourceIterator = indices[index] + 1
        }
    }

    // 返回我们需要在源字符串上进行迭代的次数
    return count
}

cpp 解法, 执行用时: 0 ms, 内存消耗: 6.9 MB, 提交时间: 2023-10-22 10:25:40

class Solution {
public:
    int shortestWay(string source, string target) {
        int sp = 0, tp = 0, ans = 1;
        int sn = source.size(), tn = target.size();
        while(tp < tn){
            while(sp < sn && source[sp] != target[tp]) ++sp;
            if(sp == sn) {
                sp = 0;
                ++ans;
                while(sp < sn && source[sp] != target[tp]) ++sp;
                if(sp == sn) return -1;
            }
            ++sp, ++tp;
        }
        return ans;
    }
};

cpp 解法, 执行用时: 0 ms, 内存消耗: 6.7 MB, 提交时间: 2023-10-22 10:25:29

class Solution {
public:
    int update(const string& target, int i, const string& source) {
        int j = 0;
        while (i < target.size() && j < source.size()) {
            if (target[i] == source[j]) {
                ++i;
                ++j;
            } else {
                ++j;
            }
        }
        return i;
    }
    int shortestWay(string source, string target) {
        int i = 0;
        int res = 0;
        while (i < target.size()) {
            ++res;
            int t = update(target, i, source);
            if (t == i) return -1;
            i = t;
        }
        return res;
    }
};

java 解法, 执行用时: 4 ms, 内存消耗: 39.4 MB, 提交时间: 2023-10-22 10:25:13

class Solution {
    public int shortestWay(String source, String target) {
        int n = source.length();
        int j = 0 ;
        int count = 0 ;
        while( j < target.length() ){
            int prev = j ;
            for(int i = 0 ; i < n ; i++){
                if( j < target.length() && source.charAt(i) == target.charAt(j) )
                    j++;
            }
            if( prev == j ) //如果j没有移动
                return -1;

            count++;
        }

        return count ;
    }
}

上一题