📜  门| GATE-CS-2016(Set 2)|第40章(1)

📅  最后修改于: 2023-12-03 15:28:44.682000             🧑  作者: Mango

题目简介

本题为 2016 年的 GATE-CS 考试中的一道题目,共有两个部分。

第一部分

第一部分要求编写一个程序,输入为一个字符串 S 和一个数字 n,输出为 S 的所有长度为 n 的子串。

例如,输入为 "hello" 和 2,输出为 "he","el","ll" 和 "lo"。

第二部分

第二部分要求编写一个程序,输入为一个有向图的邻接矩阵,输出为该有向图的所有强连通分量。

Markdown 格式代码片段
# 题目简介

本题为 2016 年的 GATE-CS 考试中的一道题目,共有两个部分。 

## 第一部分

第一部分要求编写一个程序,输入为一个字符串 S 和一个数字 n,输出为 S 的所有长度为 n 的子串。 

### 代码示例

下面是一段 Python 代码,可以实现该功能:

```python
def get_substrings(s, n):
    return [s[i:i+n] for i in range(len(s)-n+1)]

例如,输入 "hello" 和 2,输出为 ["he", "el", "ll", "lo"]。

第二部分

第二部分要求编写一个程序,输入为一个有向图的邻接矩阵,输出为该有向图的所有强连通分量。

代码示例

下面是一段 Python 代码,可以实现该功能:

def DFS(graph, visited, v, stack):
    visited[v] = True
    for i in range(len(graph)):
        if graph[v][i] and not visited[i]:
            DFS(graph, visited, i, stack)
    stack.append(v)

def transpose(graph):
    return [[graph[j][i] for j in range(len(graph))] for i in range(len(graph[0]))]

def SCC(graph):
    stack = []
    visited = [False]*len(graph)
    for i in range(len(graph)):
        if not visited[i]:
            DFS(graph, visited, i, stack)
    graph_T = transpose(graph)
    visited = [False]*len(graph_T)
    scc = []
    while stack:
        v = stack.pop()
        if not visited[v]:
            scc.append([])
            DFS(graph_T, visited, v, scc[-1])
    return scc

这段代码实现了 Tarjan 算法,用于查找有向图的所有强连通分量。可以通过传入邻接矩阵作为参数,返回一个列表,其中每个列表项都是一个强连通分量内的节点。

例如,输入邻接矩阵 [[0,1,0,0,0],[0,0,1,0,0],[0,0,0,1,0],[0,0,0,0,1],[1,0,0,0,0]],输出为 [[0, 4], [1], [2], [3]]。