字符的最短距离---cpp

题目描述

给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。
输入: S = “loveleetcode”, C = ‘e’
输出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shortest-distance-to-a-character

思路

1、类似双指针,先找到第一个相遇位置的下表,
2、开始比较,计算两个之间的距离取小值

class Solution {
public:
	int findC(string s, char c, int start) {
        int i=0;
		for(i = start; i < s.length(); i++) {
			if(s[i] == c) {
				return i;
			}
		}

		
		return 100000;
	}
    vector<int> shortestToChar(string S, char C) {
		int left = -10001;
		// 找到第一个
		int right = findC(S, C, 0);
		
		vector<int> res;
		for(int i = 0; i < S.length(); i++) {
			if(S[i] == C) {
				left = i;
				res.push_back(0);
				right = findC(S, C, i+1);
			} else {
                
				res.push_back(std::min(i-left, right-i));
			}
		}
		
		return res;
    }
};

复杂度分析

时间复杂度o(n)
空间复杂度o(n)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这道题可以考虑使用图论中的最短路算法,例如Dijkstra算法或者Floyd算法。下面是一个使用Dijkstra算法的示例代码: ```cpp #include <iostream> #include <vector> #include <queue> #include <cstring> using namespace std; const int INF = 0x3f3f3f3f; struct Edge { int to; // 目标农场编号 int dist; // 道路长度 char dir; // 道路方向 }; vector<Edge> edges[100005]; // 存储边信息的邻接表 int dis[100005]; // 存储起点到各个农场的最短距离 void dijkstra(int from) { priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; memset(dis, INF, sizeof(dis)); dis[from] = 0; pq.push(make_pair(0, from)); while (!pq.empty()) { int d = pq.top().first; int u = pq.top().second; pq.pop(); if (dis[u] < d) continue; for (int i = 0; i < edges[u].size(); ++i) { int v = edges[u][i].to; int w = edges[u][i].dist; char dir = edges[u][i].dir; if (dir == 'N' && v > u || dir == 'S' && v < u || dir == 'E' && (v - u) % n == 1 || dir == 'W' && (u - v) % n == 1) { if (dis[v] > dis[u] + w) { dis[v] = dis[u] + w; pq.push(make_pair(dis[v], v)); } } } } } int main() { int n, m; cin >> n >> m; for (int i = 1; i <= m; ++i) { int x, y, w; char d; cin >> x >> y >> w >> d; edges[x].push_back({y, w, d}); edges[y].push_back({x, w, d}); } int ans = 0; for (int i = 1; i <= n; ++i) { dijkstra(i); for (int j = 1; j <= n; ++j) { if (dis[j] != INF && dis[j] > ans) { ans = dis[j]; } } } cout << ans << endl; return 0; } ``` 在这个示例代码中,我们使用了一个邻接表来存储图的边信息。对于每条道路,我们将它的两个端点以及长度和方向存入邻接表中。在Dijkstra算法中,我们需要使用一个优先队列来维护当前到起点距离最小的农场,并且需要根据道路方向来判断是否能够到达目标农场。最后,我们遍历每个农场作为起点,求出距离最远的一对农场之间的距离,即为答案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值